Unix控制台:计算不同的异常(事先不知道)

时间:2013-10-31 11:58:17

标签: unix count grep

我试图在日志文件中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

任何建议表示赞赏。 :)

2 个答案:

答案 0 :(得分:2)

由于您要编辑冒号后的内容,我会使用sed而不是grep,然后使用sortuniq -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

答案 1 :(得分:1)

可以使用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