经常要到线上统计日志中的异常,于是有了写下面这个脚本:
egrep -o [a-zA-Z]*Exception shop-debug.log | sort | uniq -c | sort -nr
输入结果如下:
30 UndeclaredThrowableException
22 TimeoutException
9 UploadException
9 FileUploadException
3 handleException
2 RemotingException
2 PipelineException
2 NullPointerException
1 TemplateNotFoundException
1 ResourceNotFoundException
1 ActionEventNotFoundException
找到了异常之后,肯定会关注一下这个异常,但是如果日志文件太大的话,用vi打开是比较困难的。以前我很笨地用split将日志文件分割成许多的小文件,然后查看这些小文件,找到异常信息。最近发现grep有个选项可以直接打印匹配字符串的上下若干行。 这个脚本的大概样子如下:
grep -A 50 -B 50 ActionEventNotFoundException shop-debug.log
这行脚本的意义如下(grep –help可以看到其的说明):
Context control:
-B, –before-context=NUM print NUM lines of leading context [打印匹配行的前NUM行]
-A, –after-context=NUM print NUM lines of trailing context [打印匹配行的后NUM行]
另外发现在RHEL4中,grep 与 egrep是有区别的,grep默认不支持扩展正则表达式,正则中的分组功能没办法使用,所以要用到比较复杂的正则表达式时,还是用egrep吧。
Update:
更新一个统计访问日志的脚本,统计排名前10位的访问ip,据说这曾经是某公司的招SA的一道面试题。
-bash-3.00$ egrep -o ^\([0-9.]*\){4} 2010-03-25-httpd-access_log | sort | uniq -c | sort -nr | head -n 10
395 219.234.81.138
292 121.0.29.239
241 121.0.29.237
140 122.224.6.171
109 60.191.72.70
103 113.59.89.3
93 116.53.76.232
88 112.113.22.2
80 124.112.225.180
74 220.178.103.2