昨天一个同事遇到一个需求:
有一个日志文件A,当日志文件中的某行包含某个字符串BC时,将字符串EF变成EG,并输出到新文件。即:
Input,A:
asdfasdf
asdfasdBCasdfEFasd
output:
asdfasdf
asdfasdBCasdfEGasd
这个文件有500w+行。
最开始用如下脚本解决:
cat $1 | while read line do echo $line | grep -q "BC" if [ $? -eq 0 ] ; then echo $line | sed "s/EF/EG/g" >> $1.out else echo $line >>$1.out fi done
上述脚本在循环中使用了grep、sed等外部命令,由于外部命令要fork一个process,因此效率极为低下。初步估计,运行完要25个小时以上。因此将循环中的grep和sed替换掉,见如下:
cat $1 | while read line do [[ "$line" == *"BC"* ]] && echo ${line/EF/EG} || echo ${line} done
循环内部的代码简洁了很多,而且吧grep、sed等external command替换掉,在循环内部不会再有process 被fork出来。虽然执行效率提高很多,但也没有在我的耐心区间内得到结果,初步估算执行完需要半个小时以上。
问题应该不在循环内部,而是这种cat+while+read遍历文件内容的方式有问题。
换了awk的方式来做:
#!/bin/awk -f { if(match($0,"BC")){ print gsub("EF","EG"); } else{ print $0; } }
这次效率有很大的提升,耗时18秒就出来了结果。
按理说这已经比较满足需求了。
不过,我的同事又试了另外一种方法,用perl解决问题:
--这段代码是我一个同事写的。
#!/usr/bin/perl open URLFILE, ">>aa"; my $cnt=0; while (<>) { if (/BC/) { s/EF/EG/g; } print URLFILE $_; }
这段代码的执行效率很高,比awk效果还要好,13秒。
按理说,就读取文件的效率来说,perl虽然很快但应该不会比awk快。
只是这个Perl中所做的工作只是读取文件的一行,而awk在读取完一行后,还要按照分隔符将$0划分成一个个字段,分别存在$1,,,$n中,只是,我们这个需求并没有用到这个功能,用awk解决这个需求还是有点大材小用了。
关于在shell下用什么方法来完成对文件的高效遍历,还有什么更好的方法吗?
相关推荐
对linux命令tree的简单实现,遍历指定文件夹下的所有文件
采用shell脚本实现遍历文件并将文件打印到标准输出的小脚本,主要是学习。
本篇文章主要介绍了shell 遍历文件夹内所有文件并打印绝对路径,具有一定的参考价值,有兴趣的可以了解一下。
遍历磁盘目录,遍历所有文件,源码与程序都有!对病毒编写的搜索exe文件很有帮助!
主要介绍了Shell脚本实现从文件夹中递归复制文件,本文脚本实现从十层左右的文件夹中复制所有文件到一目录中,需要的朋友可以参考下
今天小编就为大家分享一篇shell 递归遍历目录下的所有文件并统一改名的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
今天小编就为大家分享一篇关于Shell脚本用for循环遍历参数的方法技巧,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
今天小编就为大家分享一篇利用shell脚本遍历文件夹内所有的文件并作整理统计的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
用shell写的递归遍历目录的脚本,脚本实现递归遍历指定目录,打印目录下的文件名。 实例1: 代码如下:#!/bin/shfunction scandir() { local cur_dir parent_dir workdir workdir=$1 cd ${workdir} if [ ${...
本文主要给大家介绍了关于使用Shell脚本循环读取文件每一行的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。 一、使用for循环 for line in `cat filename` do echo $line done ...
在将windows上的jsp网页移植到linux环境中时,发现一个个的转换编码及修改默认编码类型太慢,写此脚本进行尝试文件遍历~ 好久不写,手生了。 代码如下: #!/bin/bash # # SPATH=”/root/chengji/WebRoot” DPATH=”/...
今天小编就为大家分享一篇使用Shell遍历目录及其子目录中的所有文件方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
shell中获取n天前的日期,使用shell获取当前日期n天之前的日期
下面介绍两种常用的方法来进行相关的操作。 一、使用${} 1、${var##*/} 该命令的作用是去掉变量var从左边算起的最后一个’/’字符及其左边的内容,返回从左边算起的最后一个’/’(不含该字符)的右边的内容。使用...
主要介绍了在shell通过遍历输出两个日期范围内所有日期的方法,文中给出了详细的示例代码以及实现思路流程,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
主要介绍了Shell实现读取ini格式配置文件方法,本文直接给出实现代码,需要的朋友可以参考下
发现php的文件夹函数好像没有提供遍历文件夹下的所有文件(包括子目录中的文件),于是,就想自己实现一个。 在写的时候发现一些操作文件夹的函数并不是自己想的那样。比如,dirname()根据提供的完整文件路径来取得...
主要介绍了在Shell命令行处理JSON数据的方法,使用jq工具实现,需要的朋友可以参考下