我试图在日志文件中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
任何建议表示赞赏。 :)
答案 0 :(得分:2)
由于您要编辑冒号后的内容,我会使用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
答案 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