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



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

这可以通过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

最新更新