特定のUUIDで始まるhttpスレッドのログファイルからデータを抽出したいと思います。ログの例:
2018-09-26 06:34:24,815 INFO [com.xxx.xxx.xxx] (http-threads-threads - 73244) UUID: 111-222-333-444-555
2018-09-26 06:34:25,224 WARN [com.xxx.xxx.xxx] (http-threads-threads - 74391) Some log message
2018-09-26 06:34:26,782 INFO [com.xxx.xxx.xxx] (http-threads-threads - 74399) Some log message
2018-09-26 06:34:26,945 ERROR [com.xxx.xxx.xxx] (http-threads-threads - 73244) Some exception message of the right thread
at com.xxx.xxx.xxx(someclass.java:114) [somejar.jar:1.0.0]
at com.xxx.xxx.xxx(someclass.java:65) [somejar.jar:1.0.0]
at com.xxx.xxx.xxx(someclass.java:85) [classes:]
2018-09-26 06:34:26,950 ERROR [com.xxx.xxx.xxx] (http-threads-threads - 74256) Unauthorized: com.xxx.xxx.xxx: Unauthorized
at com.xxx.xxx.xxx(someclass.java:39) [somejar.jar:1.0.0]
at com.xxx.xxx.xxx(someclass.java:49) [somejar.jar:1.0.0]
at com.xxx.xxx.xxx(someclass.java:45) [somejar.jar:1.0.0]
2018-09-26 06:34:26,952 INFO [com.xxx.xxx.xxx] (http-threads-threads - 74395) Some log message
2018-09-26 06:34:27,014 WARN [com.xxx.xxx.xxx] (http-threads-threads - 73244) Some log message of the right thread
2018-09-26 06:34:27,530 INFO [com.xxx.xxx.xxx] (http-threads-threads - 74365) Some log message
すでにgrepとBASH_REMATCHを使用してUUIDを取得し、スレッド番号を抽出できます。スレッド番号を知ると、「http-threads-threads-73244」を検索できます。ここで、その文字列を含むすべての行とその行(タブ付き行)の後の最後の例外を印刷したいと思います。
私は次の出力が欲しい:
2018-09-26 06:34:24,815 INFO [com.xxx.xxx.xxx] (http-threads-threads - 73244) UUID: 111-222-333-444-555
2018-09-26 06:34:26,945 ERROR [com.xxx.xxx.xxx] (http-threads-threads - 73244) Some exception message of the right thread
at com.xxx.xxx.xxx(someclass.java:114) [somejar.jar:1.0.0]
at com.xxx.xxx.xxx(someclass.java:65) [somejar.jar:1.0.0]
at com.xxx.xxx.xxx(someclass.java:85) [classes:]
2018-09-26 06:34:27,014 WARN [com.xxx.xxx.xxx] (http-threads-threads - 73244) Some log message of the right thread
grep -A 3
一致後のタブ行の数は可変であり、使用できません。
を使用して追加のawk '/http\-threads\-threads \- 73244/{print $0; getline}/\tat/{print $0}' log.log
タブ行を印刷することもできます。
を使用すると、awk '/http\-threads\-threads \- 73244/{a=1;print}/(2[0-9][0-9][0-9]\-[0-1]\-[0-9])/{a=0}' log.log
タブ行はまったく印刷されません。
完全な解決策は、以前に追加の「grep」と「BASH_REMATCH」を削除してUUIDを使用することですが、スレッド番号を「入力」として使用するソリューションではまったく問題ありません。
誰にも解決策はありますか?
答え1
次のAWKスクリプトはUUIDと一致し、関心のある対応する行を出力します。
#!/usr/bin/awk -f
/UUID: 111-222-333-444-555/ {
tid = substr($7, 1, length($7) - 1)
}
/^[^\t].*http-threads-threads/ {
if (substr($7, 1, length($7) -1) == tid) {
matched = 1
print
} else {
matched = 0
}
}
/^\t/ && matched
最初のブロックはUUIDと一致し、対応するスレッド識別子を格納します。
2番目のブロックは、タブで始まらず、「http-threads-threads」を含む行と一致します。 7番目のフィールドがスレッド識別子と一致する場合、スクリプトは一致するブロックにあることを示し、現在の行を印刷します。それ以外の場合、スクリプトは一致するブロックにないことを示します。
一致ブロック内にあるとき、3番目のブロックはタブ文字で始まる行を一致させて印刷します(現在の行を印刷するのはデフォルトの動作です)。