Text-Processing

從日誌文件中提取一行中的模式並列印下 n 行直到下一個模式

  • April 1, 2021

假設文件 log.txt 包含以下內容

[12] 03/31/21 08:33:30.080851 T(12581) _DBG message x 1
[12] 03/31/21 08:33:30.080851 T(34897) _DBG message y 1
[12] 03/31/21 08:33:31.241167 T(12344) _DBG message z 1
[12] 03/31/21 08:33:31.457612 T(34897) _DBG message y 2
                       test message line 2
                       test message line 3 
                       test message line 4 
[12] 03/31/21 08:33:31.78912 T(12344) _DBG message z 2
[12] 03/31/21 08:33:32.56341 T(34897) _DBG message y 3
[12] 03/31/21 08:33:33.12789 T(12581) _DBG message x 2
                       test message for x
[12] 03/31/21 08:33:33.78123 T(34897) _DBG message y 3
                       test message line 2
[12] 03/31/21 08:33:34.12342 T(12581) _DBG message x 3
[12] 03/31/21 08:33:34.56712 T(34897) _DBG message y 4

期望的輸出應該是

[12] 03/31/21 08:33:30.080851 T(34897) _DBG message y 1
[12] 03/31/21 08:33:31.457612 T(34897) _DBG message y 2
                       test message line 2
                       test message line 3 
                       test message line 4 
[12] 03/31/21 08:33:32.56341 T(34897) _DBG message y 3
[12] 03/31/21 08:33:33.78123 T(34897) _DBG message y 3
                       test message line 2
[12] 03/31/21 08:33:34.56712 T(34897) _DBG message y 4

給定一個執行緒 ID,它應該列印屬於該 msg 的行 + 接下來的幾行。請注意,在所需的輸出中,所有其他執行緒消息都被刪除。

我在 sed 命令下嘗試過,但它也列印下一行(這是不同的執行緒消息)

sed -n -e '/T(34897)/,/_DBG/ p' log.txt 

我嘗試了其他 grep/awk/regex 命令,但無法完成。請幫忙

$ awk -v t=34897 '/^\[/{f=($4=="T("t")")} f' file
[12] 03/31/21 08:33:30.080851 T(34897) _DBG message y 1
[12] 03/31/21 08:33:31.457612 T(34897) _DBG message y 2
                       test message line 2
                       test message line 3
                       test message line 4
[12] 03/31/21 08:33:32.56341 T(34897) _DBG message y 3
[12] 03/31/21 08:33:33.78123 T(34897) _DBG message y 3
                       test message line 2
[12] 03/31/21 08:33:34.56712 T(34897) _DBG message y 4

每次f看到以[. 如果該行的第 4 個欄位設置為真 (1),否則設置為假 (0) T(<target value>)f當讀取每一行時,如果f當時為真,則列印目前行。

對於任何 awk 腳本,如果您希望以不同的格式查看它並減少對預設值的依賴以使其不那麼簡潔和清晰,您可以使用 GNU awk 漂亮地列印它(注意:它必須是 gawk,而不是一些其他 awk 變體)為awk -o- ...

$ awk -o- -v t=34897 '/^\[/{f=($4=="T("t")")} f' file
/^\[/ {
       f = ($4 == "T(" t ")")
}

f {
       print
}

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