1

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

任何建议表示赞赏。:)

4

2 回答 2

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
于 2013-10-31T12:05:57.927 回答
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
于 2013-10-31T12:06:45.003 回答