Text-Processing

awk/sed/grep:列印與字元串匹配的所有行以及在這些行之後帶有製表符的所有行

  • September 30, 2018

我想從日誌文件中提取以特定 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,因為匹配後標籤行的數量是可變的。

Usingawk '/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,但我完全可以使用將執行緒號作為“輸入”的解決方案。

有人對此有解決方案嗎?

以下 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 並儲存相應的執行緒標識符。

第二個塊匹配不以製表符開頭的行,包含“http-threads-threads”。如果第七個欄位與執行緒標識符匹配,則腳本說明我們在匹配塊中,並列印目前行;否則,腳本會指出我們不在匹配的塊中。

當我們在匹配塊中時,第三個塊匹配以製表符開頭的行,並列印它們(列印目前行是預設操作)。

引用自:https://unix.stackexchange.com/questions/471835