黑帽联盟

标题: Linux 通过shell脚本逐行读取文件的多种方法 [打印本页]

作者: yun    时间: 2017-1-25 16:38
标题: Linux 通过shell脚本逐行读取文件的多种方法
在Linux中有很多方法逐行读取一个文件的方法,其中最常用的就是下面的脚本里的方法,而且是效率最高,使用最多的方法。为了给大家一个直观的感受,我们将通过生成一个大的文件的方式来检验各种方法的执行效率。

方法1:while循环中执行效率最高,最常用的方法。
  1. function while_read_LINE_bottm(){
  2. While read LINE
  3. do
  4. echo $LINE
  5. done  < $FILENAME
  6. }
复制代码
注释:我习惯把这种方式叫做read釜底抽薪,因为这种方式在结束的时候需要执行文件,就好像是执行完的时候再把文件读进去一样。



方法2 : 重定向法;管道法: cat $FILENAME | while read LINE
  1. Function While_read_LINE(){
  2. cat $FILENAME | while read LINE
  3. do
  4. echo $LINE
  5. done
  6. }
复制代码
注释:我只所有把这种方式叫做管道法,相比大家应该可以看出来了吧。当遇见管道的时候管道左边的命令的输出会作为管道右边命令的输入然后被输入出来。



方法3: 文件描述符法
  1. Function while_read_line_fd(){
  2. Exec 3<&0
  3. Exec 0<$FILENAME
  4. While read LINE
  5. Do
  6. Echo $LINE
  7. Exec 0<&<3
  8. }
复制代码
注释: 这种方法分2步骤,第一,通过将所有内容重定向到文件描述符3来关闭文件描述符0.为此我们用了语法Exec 3<&0 。第二部将输入文件放送到文件描述符0,即标准输入。



方法4    for  循环。
  1. function  for_in_file(){
  2. For  i  in  `cat $FILENAME`
  3. do
  4. echo $i
  5. done
  6. }
复制代码
注释:这种方式是通过for循环的方式来读取文件的内容相比大家很熟悉了,这里不多说。




对各个方法进行测试,看哪种方法的执行效率最高。

首先我们用脚本(脚本见附件)生成一个70000行的文件,文件位置在/scripts/bigfile。然后通过下面的脚本来测试各个方法的执行效率,脚本很简单,不再解释。
  1. #!/bin/bash
  2. FILENAME="$1"
  3. TIMEFILE="/tmp/loopfile.out" > $TIMEFILE
  4. SCRIPT=$(basename $0)
  5. function usage(){
  6. echo -e "\nUSAGE: $SCRIPT file \n"
  7. exit 1
  8. }
  9. function while_read_bottm(){
  10. while read LINE
  11. do
  12. echo $LINE
  13. done < $FILENAME
  14. }
  15. function while_read_line(){
  16. cat $FILENAME | while read LINE
  17. do
  18. echo $LINE
  19. done
  20. }
  21. function while_read_line_fd(){
  22. exec 3<&0
  23. exec 0< $FILENAME
  24. while read LINE
  25. do
  26. echo $LINE
  27. done
  28. exec 0<&3
  29. }
  30. function for_in_file(){
  31. for i in  `cat $FILENAME`
  32. do
  33. echo $i
  34. done
  35. }
  36. if [ $# -lt 1 ] ; then
  37. usage
  38. fi
  39. echo -e " \n starting file processing of each method\n"
  40. echo -e "method 1:"
  41. echo -e "function while_read_bottm"
  42. time while_read_bottm >> $TIMEFILE
  43. echo -e "\n"
  44. echo -e "method 2:"
  45. echo -e "function while_read_line "
  46. time while_read_line >> $TIMEFILE
  47. echo -e "\n"
  48. echo -e "method 3:"
  49. echo "function while_read_line_fd"
  50. time while_read_line_fd >>$TIMEFILE
  51. echo -e "\n"
  52. echo -e "method 4:"
  53. echo -e "function  for_in_file"
  54. time  for_in_file >> $TIMEFILE
复制代码
执行脚本后: [root@localhost shell]# ./while/scripts/bigfile
脚本输出内容:
method 1:
function while_read_bottm

real    0m5.689s
user    0m3.399s
sys    0m1.588s
method 2:
function while_read_line

real    0m11.612s
user    0m4.031s
sys    0m4.956s


method 3:
function while_read_line_fd

real    0m5.853s
user    0m3.536s
sys    0m1.469s


method 4:
function  for_in_file

real    0m5.153s
user    0m3.335s
sys    0m1.593s



下面我们对各个方法按照速度进行排序。
real    0m5.153s    method 4 (for 循环法)
real    0m5.689s    method 1  (while 釜底抽薪法)
real    0m5.853s    method 3    (标识符法)
real    0m11.612s  method 2    (管道法)


由此可见在各个方法中,for语句效率最高,而在while循环中读写文件时,
  1. while read LINE
  2. do
  3. echo $LINE
  4. done < $FILENAME
复制代码
方式执行效率最高。






欢迎光临 黑帽联盟 (https://bbs.cnblackhat.com/) Powered by Discuz! X2.5