我试图在日志文件中grep所有发生的异常(我事先不知道异常)并评估它们的发生次数。这里有一个例子来阐明我试图实现的目标:
请考虑以下日志文件:
org.hibernate.exception.SQLGrammarException: ...
org.springframework.web.client.ResourceAccessException: I/O error: ...
org.springframework.web.client.HttpServerErrorException: ...
org.springframework.mail.MailSendException: ...
org.springframework.mail.MailSendException: ...
org.hibernate.exception.SQLGrammarException: ...
当然,日志文件不仅包含包含异常的行,因此还有一些我不感兴趣的东西(警告,信息等)
我想获得以下输出(完全限定的异常名称和发生次数,顺序是不可分割的):
org.hibernate.exception.SQLGrammarException 2
org.springframework.web.client.ResourceAccessException 1
org.springframework.web.client.HttpServerErrorException 1
org.springframework.mail.MailSendException 2
我想出了以下 grep 命令/模式来查找所有异常,但我无法选择匹配的组来进一步计算发生次数:
grep -ioP --color "^[.*.?]*(.*Exception):" myLogFile.log
任何建议都值得赞赏。 :)
由于您想编辑冒号后面的内容,因此我会使用 sed
而不是 grep
,然后sort
并uniq -c
:
sed -n '/(^[^:]*[eE]xception):.*/s//1/p' log-file |
sort |
uniq -c
这将首先为您提供计数,然后是异常名称;如果您确实需要计数,则
:sed -n '/(^[^:]*[eE]xception):.*/s//1/p' log-file |
sort |
uniq -c |
awk '{ print $2, $1}'
如果需要,还可以按异常频率的顺序排序(在awk
处理之前或之后)。
您还可以在awk
完成整个工作:
awk -F: '{ count[$1]++ } END { for (i in count) print i, count[i]; }' log-file
鉴于awk
,你也可以用Perl编写它:
perl -F: -nae '$count{$F[0]}++; END {print "$_ $count{$_}n" foreach (keys %count); }' log-file
这可以通过awk
来完成:
awk '{a[$1]++} END {for (i in a) print i,a[i]}' file
org.springframework.web.client.HttpServerErrorException: 1
org.hibernate.exception.SQLGrammarException: 2
org.springframework.mail.MailSendException: 2
org.springframework.web.client.ResourceAccessException: 1