web-dev-qa-db-ja.com

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
_

すでにUUIDを検索し、grepとBASH_REMATCHを使用してスレッド番号を抽出できます。スレッド番号がわかれば、「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を使用することもできますが、スレッド番号を「入力」として使用するソリューションではまったく問題ありません。

誰かがこれに対する解決策を持っていますか?

2
ven_sr

次の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番目のブロックは、一致するブロック内にあるときにタブで始まる行と一致し、それらを印刷します(現在の行の印刷がデフォルトのアクションです)。

4
Stephen Kitt