`
DiaoCow
  • 浏览: 241531 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

这周写脚本过程中的一点收获

 
阅读更多
这周写了两个脚本,不算太难,但是每一个都让我有所感悟.....

第一个脚本是这样的:分析一个12G大小的 apache cookie_log,从中删选出指定数据然后分析统计

我的原先做法是: sed 's/.../../' | awk '{...}' ,即先用sed命令对数据进行替换,增加修改成我希望的样子,然后再用awk分析统计

这样看貌似没什么问题,但是如果原始数据很大(比如我这里的12G),执行起来就很耗时了

我自己思考了一下原因,觉得是由于由于管道(|),使得我相当于对文件读取了两次(当文件很大的时候),鉴于此我后来只用一个命令awk处理,并且把指令写到一个文件中,结果发现,效率果然有了较大的提高,只花了原先的1/10时间。

所以当我们处理一个较大文件,并且需要比较复杂的分析时,请减少管道的使用,尽量在一个awk命令中完成,并且最好把命令写成文件的形式,既保证可读性又提高复用性


第二个脚本是这样的:需要将一个项目里(有11个svn分支)中的某四个方法,替换成另外的四个方法

我的第一反应是写四个类似这样的方法:find . -name "*.java" | xargs sed -i 's/../../'

但是我自己一想,这样岂不是要遍历目录4遍,效率肯定不行,于是乎,我自己写了个遍历文件夹的方法,如果遇到的是文件就进行内容替换(4种),如果还是目录则进行子目录递归,这样保证了我只需要遍历一次

等我实现这种方式以后,我发现了一个很不好的地方,就是脚本有点长,可读性也不太好(虽然我抽了几个函数),于是我又用第一种老土的方式又实现了一遍,结果是出乎意料的

首先,代码可读性好,逻辑清楚(1.先拉svn分支,然后调用replace函数替换内容,其中replace函数就是那四个find替换命令)

其次,效率也很好(应该比我自己写的遍历目录方法快),因为你自己写遍历函数需要通过for,if这的shell语句去控制逻辑,并且中间过程中还需要执行外部命令,譬如cd,但是find 就不一样了,所以都这些都在一个命令中完成,因此它的效率会更高

所以,通过这个脚本我发现,写脚本首先要注重可读性和可维护性,其次善于用现有的命令去实现自己需要的功能(譬如这里的find遍历目录功能)






分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics