awk/sed/grep: 文字列に一致するすべての行とタブ文字が続くすべての行を印刷します。

awk/sed/grep: 文字列に一致するすべての行とタブ文字が続くすべての行を印刷します。

特定の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番目のブロックは、タブで始まらず、「h​​ttp-threads-threads」を含む行と一致します。 7番目のフィールドがスレッド識別子と一致する場合、スクリプトは一致するブロックにあることを示し、現在の行を印刷します。それ以外の場合、スクリプトは一致するブロックにないことを示します。

一致ブロック内にあるとき、3番目のブロックはタブ文字で始まる行を一致させて印刷します(現在の行を印刷するのはデフォルトの動作です)。

関連情報