1

私の Tomcat ログは次の形式で作成されます。

[<DATE>] [<COMPONENT>] ERROR_TYPE <ERROR_NAME> - <Rest of line>

またはのようなlog4j値ERROR_TYPEはどこにありますか。DEBUGERROR

例えば、

[18/Jul/2012:08:53:39 +0000] [component1] ERROR ConnectionTimeOut - ...
[18/Jul/2012:09:54:32 +0000] [component2] DEBUG IPNotFound - ...
[18/Jul/2012:09:54:32 +0000] [component1] TRACE Connected - ...
[18/Jul/2012:08:53:39 +0000] [component1] ERROR ConnectionTimeOut - ...

(ERROR_TYPE, ERROR_NAME)タプルから出現回数へのマップを作成したいと思います。

ERROR ConnectionTimeOut       2
DEBUG IPNotFound              1
TRACE Connected               1

次のようなものを一致させるにはどうすればよいですか:

_anything_ (ERROR|DEBUG|TRACE|WARN|FATAL_spaces_ _another_word_)_anything_

AWK で、括弧内の部分だけを返しますか?

4

1 に答える 1

3
awk '/ERROR|DEBUG|TRACE|WARN|FATAL/ {count[$4,$5]++} END {for (i in count) {split(i, a, SUBSEP); print a[1], a[2], count[i]}}' inputfile

エラータイプを含む行が選択されます。count配列要素は、型と名前を合わせてインデックスとしてインクリメントされます。コンマはSUBSEP変数の内容を表し、デフォルトは\034です。ブロックで、配列をEND反復処理し、変数を使用してインデックスを分割します。タイプ、名前、およびカウントを出力します。countSUBSEP

編集:

これは正規表現を使用して、構造化されていないログ エントリを処理します。

awk 'match($0, /(ERROR|DEBUG|TRACE|WARN|FATAL) +[^ ]+/) {s = substr($0, RSTART, RLENGTH); split(s, a); count[a[1],a[2]]++} END {for (i in count) {split(i, a, SUBSEP); print a[1], a[2], count[i]}}' inputfile
于 2012-07-18T10:52:34.477 に答える