手头的工作需要,要求将apache的请求日志信息按照某个特定的参数值进行统计,然后分文件(文件名即为特定的参数名,如对某个特定文件的请求而留下来的包含文件名的日志)存储计算结果。对于我这种linux脚本操作菜鸟来说,存在一个难点:如何抓出文件名,并且根据文件名分别计算(此处的计算简化为统计对不同文件名的请求次数),折腾了半天,成型的脚本如下:
cat log.txt | grep “.*hardwareid=1.*” | sed -e “s/hardwareid=\([0-9a-z]*\)&/#\1#/” | awk -F “#” ‘BEGIN{}{sum[$2]+=1;};END{for(tmp in sum) print tmp,sum[tmp]>tmp}’
对脚本进行简要分析:
1.cat log.txt 表示抓取要分析的文件到屏幕输出
2.grep 表示过滤条件,此处只输出hardwareid参数以1开头的行。
3.sed 是强大的文本处理工具,此处用正则表达式将hardwareid=****** 的地方替换成为#******#,为什么这样做呢?全都是为后续处理服务的。值得一提的是好像正则并不是同样的,而且相关的文档中还提到了sed特有的正则规则,需要引起重视,否则调试会很费时间,而且难以找到错误,在这里之前我用.{32}替换[0-9a-z]*就没有成功(从一般用法来讲,没错吧?)。
4.awka是一种样式扫描与处理工具,比sed更为强大,因为它是交互式的,在这里有一篇不错的文章介绍它,我也是看了文章才逐渐明白其作用和用法的。在上面的命令行中,awk干了这样的事情,首先将分隔符设置为#,因为默认的是空格,于是,和第3步联系起来,其实后面的$2取的便是******,后面的程序从字面上解释如下:统计每一个******值出现的次数(sum[$2]+=1),最后输出******值以及其出现次数,然后保存到名为******的文件中(>tmp)
这样,经过4步,便实现了最初的需求,对我这种需要从命令的含义来入手的菜鸟来说,花费的时间精力不少,其调试过程等等,都在摸索和积累经验,希望是个好的开端吧。
One Comment for this post
师兄不错不错了,偶学了一段时间了,也还要照着sed和awk的例子凑自己的脚本
回复
Leave a comment