设为首页 收藏本站
查看: 818|回复: 0

[经验分享] Linux shell逐行读取文件的方法

[复制链接]

尚未签到

发表于 2017-11-17 20:48:11 | 显示全部楼层 |阅读模式

  • 在linux中有很多方法逐行读取一个文件的方法,其中最常用的就是下面的脚本里的方法,而且是效率最高,使用最多的方法。为了给大家一个直观的感受,我们将通过生成一个大的文件的方式来检验各种方法的执行效率。  
  • 方法1:while循环中执行效率最高,最常用的方法。  
  •    
  • function while_read_LINE_bottm(){  
  • While read LINE  
  • do  
  • echo $LINE  
  • done   < $FILENAME  
  • }  
  •    
  •          注释:我习惯把这种方式叫做read釜底抽薪,因为这种方式在结束的时候需要执行文件,就好像是执行完的时候再把文件读进去一样。  
  •    
  • 方法2 : 重定向法;管道法: cat $FILENAME | while read LINE  
  •    
  • Function While_read_LINE(){  
  • cat $FILENAME | while read LINE  
  • do  
  • echo $LINE  
  • done  
  • }  
  •           注释:我只所有把这种方式叫做管道法,相比大家应该可以看出来了吧。当遇见管道的时候管道左边的命令的输出会作为管道右边命令的输入然后被输入出来。  
  •    
  • 方法3: 文件描述符法  
  •    
  • Function while_read_line_fd(){  
  • Exec 3<&0  
  • Exec 0<$FILENAME  
  • While read LINE  
  • Do  
  • Echo $LINE  
  • Exec 0<&<3  
  • }  
  •    
  •          注释: 这种方法分2步骤,第一,通过将所有内容重定向到文件描述符3来关闭文件描述符0.为此我们用了语法Exec 3<&0 。第二部将输入文件放送到文件描述符0,即标准输入。  
  •    
  • 方法4    for  循环。  
  •    
  • function  for_in_file(){  
  • For  i  in  `cat $FILENAME`  
  • do  
  • echo $i  
  • done  
  • }  
  •            注释:这种方式是通过for循环的方式来读取文件的内容相比大家很熟悉了,这里不多说。  
  •    
  •    
  •      对各个方法进行测试,看那方法的执行效率最高。  
  •    
  •            首先我们用脚本(脚本见附件)生成一个70000行的文件,文件位置在/scripts/bigfile。然后通过下面的脚本来测试各个方法的执行效率,脚本很简单,不再解释。  
  •    
  • #!/bin/bash  
  • FILENAME="$1"  
  • TIMEFILE="/tmp/loopfile.out" > $TIMEFILE  
  • SCRIPT=$(basename $0)  
  •    
  • function usage(){  
  • echo -e "\nUSAGE: $SCRIPT file \n"  
  •    
  • exit 1  
  • }  
  •    
  • function while_read_bottm(){  
  •    
  • while read LINE  
  • do  
  • echo $LINE  
  •    
  • done < $FILENAME  
  •    
  • }  
  •    
  • function while_read_line(){  
  •    
  • cat $FILENAME | while read LINE  
  • do  
  • echo $LINE  
  • done  
  •    
  • }  
  •    
  • function while_read_line_fd(){  
  •    
  • exec 3<&0  
  • exec 0< $FILENAME  
  • while read LINE  
  • do  
  • echo $LINE  
  • done  
  • exec 0<&3  
  • }  
  •    
  • function for_in_file(){  
  • for i in   `cat $FILENAME`  
  • do  
  • echo $i  
  • done  
  • }  
  •    
  • if [ $# -lt 1 ] ; then  
  • usage  
  • fi  
  • echo -e " \n starting file processing of each method\n"  
  • echo -e "method 1:"  
  • echo -e "function while_read_bottm"  
  • time while_read_bottm >> $TIMEFILE  
  •    
  • echo -e "\n"  
  •    
  • echo -e "method 2:"  
  • echo -e "function while_read_line "  
  • time while_read_line >> $TIMEFILE  
  •    
  • echo -e "\n"  
  • echo -e "method 3:"  
  • echo "function while_read_line_fd"  
  • time while_read_line_fd >>$TIMEFILE  
  •    
  • echo -e "\n"  
  • echo -e "method 4:"  
  • echo -e "function   for_in_file"  
  • time   for_in_file >> $TIMEFILE  
  •    
  •      执行脚本后: [iyunv@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循环中读写文件时,  
  • while read LINE  
  • do  
  • echo $LINE  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-408029-1-1.html 上篇帖子: Linux性能测试分析命令_iostat 下篇帖子: 二:Linux 的基本命令、VI编辑器、Linux中软件安装
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表