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し、次にsortand を使用し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
于 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 に答える