Linux shell逐行讀取文件的方法


  1. 在linux中有很多方法逐行讀取一個文件的方法,其中最常用的就是下面的腳本里的方法,而且是效率最高,使用最多的方法。為了給大家一個直觀的感受,我們將通過生成一個大的文件的方式來檢驗各種方法的執行效率。  
  2. 方法1:while循環中執行效率最高,最常用的方法。  
  3.    
  4. function while_read_LINE_bottm(){  
  5.  While read LINE  
  6.  do  
  7. echo $LINE  
  8. done   < $FILENAME  
  9. }  
  10.    
  11.          注釋:我習慣把這種方式叫做read釜底抽薪,因為這種方式在結束的時候需要執行文件,就好像是執行完的時候再把文件讀進去一樣。  
  12.    
  13. 方法2 : 重定向法;管道法: cat $FILENAME | while read LINE  
  14.    
  15. Function While_read_LINE(){  
  16.  cat $FILENAME | while read LINE  
  17.  do  
  18. echo $LINE  
  19. done  
  20. }  
  21.           注釋:我只所有把這種方式叫做管道法,相比大家應該可以看出來了吧。當遇見管道的時候管道左邊的命令的輸出會作為管道右邊命令的輸入然后被輸入出來。  
  22.    
  23. 方法3: 文件描述符法  
  24.    
  25. Function while_read_line_fd(){  
  26. Exec 3<&0  
  27. Exec 0<$FILENAME  
  28. While read LINE  
  29. Do  
  30.  Echo $LINE  
  31.  Exec 0<&<3  
  32. }  
  33.    
  34.          注釋: 這種方法分2步驟,第一,通過將所有內容重定向到文件描述符3來關閉文件描述符0.為此我們用了語法Exec 3<&0 。第二部將輸入文件放送到文件描述符0,即標准輸入。  
  35.     
  36. 方法4    for  循環。  
  37.    
  38. function  for_in_file(){  
  39. For  i  in  `cat $FILENAME`  
  40. do  
  41. echo $i  
  42. done  
  43. }  
  44.            注釋:這種方式是通過for循環的方式來讀取文件的內容相比大家很熟悉了,這里不多說。  
  45.    
  46.    
  47.      對各個方法進行測試,看那方法的執行效率最高。  
  48.    
  49.            首先我們用腳本(腳本見附件)生成一個70000行的文件,文件位置在/scripts/bigfile。然后通過下面的腳本來測試各個方法的執行效率,腳本很簡單,不再解釋。  
  50.    
  51. #!/bin/bash  
  52. FILENAME="$1"  
  53. TIMEFILE="/tmp/loopfile.out" > $TIMEFILE  
  54. SCRIPT=$(basename $0)  
  55.    
  56. function usage(){  
  57. echo -e "\nUSAGE: $SCRIPT file \n"  
  58.    
  59. exit 1  
  60. }  
  61.    
  62. function while_read_bottm(){  
  63.    
  64. while read LINE  
  65. do  
  66. echo $LINE  
  67.    
  68. done < $FILENAME  
  69.    
  70. }  
  71.    
  72. function while_read_line(){  
  73.    
  74. cat $FILENAME | while read LINE  
  75. do  
  76. echo $LINE  
  77. done  
  78.    
  79. }  
  80.    
  81.  function while_read_line_fd(){  
  82.    
  83. exec 3<&0  
  84. exec 0< $FILENAME  
  85. while read LINE  
  86. do  
  87.  echo $LINE  
  88. done  
  89.  exec 0<&3  
  90. }  
  91.    
  92. function for_in_file(){  
  93. for i in   `cat $FILENAME`  
  94. do  
  95. echo $i  
  96. done  
  97. }  
  98.    
  99. if [ $# -lt 1 ] ; then  
  100. usage  
  101. fi  
  102.  echo -e " \n starting file processing of each method\n"  
  103.  echo -e "method 1:"  
  104.  echo -e "function while_read_bottm"  
  105.  time while_read_bottm >> $TIMEFILE  
  106.    
  107. echo -e "\n"  
  108.    
  109. echo -e "method 2:"  
  110. echo -e "function while_read_line "  
  111. time while_read_line >> $TIMEFILE  
  112.    
  113. echo -e "\n"  
  114. echo -e "method 3:"  
  115. echo "function while_read_line_fd"  
  116. time while_read_line_fd >>$TIMEFILE  
  117.    
  118. echo -e "\n"  
  119. echo -e "method 4:"  
  120. echo -e "function   for_in_file"  
  121. time   for_in_file >> $TIMEFILE  
  122.    
  123.      執行腳本后: [root@localhost shell]# ./while /scripts/bigfile  
  124. 腳本輸出內容:  
  125. method 1:  
  126. function while_read_bottm  
  127.    
  128. real    0m5.689s  
  129. user    0m3.399s  
  130. sys     0m1.588s  
  131.    
  132.    
  133. method 2:  
  134. function while_read_line  
  135.    
  136. real    0m11.612s  
  137. user    0m4.031s  
  138. sys     0m4.956s  
  139.    
  140.    
  141. method 3:  
  142. function while_read_line_fd  
  143.    
  144. real    0m5.853s  
  145. user    0m3.536s  
  146. sys     0m1.469s  
  147.    
  148.    
  149. method 4:  
  150. function   for_in_file  
  151.    
  152. real    0m5.153s  
  153. user    0m3.335s  
  154. sys     0m1.593s  
  155.    
  156.    
  157. 下面我們對各個方法按照速度進行排序。  
  158. real    0m5.153s    method 4 (for 循環法)  
  159. real    0m5.689s    method 1   (while 釜底抽薪法)  
  160. real    0m5.853s    method 3    (標識符法)  
  161. real    0m11.612s   method 2     (管道法)  
  162.    
  163.  由此可見在各個方法中,for語句效率最高,而在while循環中讀寫文件時,  
  164. while read LINE  
  165. do  
  166. echo $LINE  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM