ログファイル内のエラーメッセージをカウントする

ログファイル内のエラーメッセージをカウントする
com.mysql.jdbc.MysqlDataTruncation: Data truncation: Out of range value for column 'current_state' at r:1
com.mysql.jdbc.MysqlDataTruncation: Data truncation: Out of range value for column 'current_state' at r:2
com.mysql.jdbc.MysqlDataTruncation: Data truncation: Out of range value for column 'current_state' at r:5
java.lang.NullPointerException:12
java.lang.NullPointerException:7
java.lang.NullPointerException:18
java.lang.NullPointerException:2 

ご覧のとおり、重複した MySQL エラーが 3 つあり、その頻度が最後に表示されます。最初のエラーでは 1、2 番目のエラーでは 2、3 番目では 5 と表示されます。スクリプトを合計とともに 1 つの重複行のままにしておきたいです。Java エラーについても同じことを行います。

期待される出力:

com.mysql.jdbc.MysqlDataTruncation: Data truncation: Out of range value for column 'current_state' at r:8
java.lang.NullPointerException:39

答え1

awk 'BEGIN{ FS=OFS=":" }
   { freq=$NF; sub(/:[^:]*$/, ""); seen[$0]+=freq }
END{ for (x in seen) print x, seen[x] }' infile

FS は入力フィールド区切り文字で、OFS は出力フィールド区切り文字です。両方ともコロンに設定し、最後のフィールドを$NF一時変数に取得しfreqて、sub() 関数を使用して現在の入力レコードから最後のフィールドを削除します$0

こうすることで、seen[$0]+=freq最後のフィールドの値について、変数に以前保持していた頻度と同じログ行 (最後のフィールドはすでに除外されています) を合計しますfreq

そして最後に、配列をループし、行とその合計頻度を出力します。

関連情報