Awk

與linux匹配的相對日誌文件?

  • February 10, 2021

我已經知道如何使用grepawk匹配日誌文件中的某些內容,但是有沒有辦法執行以下操作?

  1. 匹配文件中的特定行…並將其包含在結果中。
  2. 從文件中 (1.) 中的匹配行開始,直到匹配到第二個字元串並將其包括在結果中的所有行。
  3. 然後使用第三個匹配項從匹配項 (1.) 開始向下搜尋,匹配第三個字元串並將其包括在結果中的所有行之間。

這樣,如果正在搜尋的內容是在 BEGINNING 和 END 的上下文中,您可以只搜尋您正在搜尋的內容髮生的上下文。日誌文件如下所示:

<several-1000-lines>
...[BEGINX]
some log a
<several-1000-lines>
...[First-string-i-search-for]
<several-1000-lines>
some log b
...[ENDX]
<several-1000-lines>

然後我會在搜尋後得到類似的輸出[First-string-i-search-for]

...[BEGINX]
some log a
<several-1000-lines>
...[First-string-i-search-for]
<several-1000-lines>
some log b
...[ENDX]

grep使用支持 PCRE(Perl 兼容的正則表達式)的GNU :

grep -Pzo '.*\[BEGINX\](.|\n)*?\[First-string-i-search-for\](.|\n)*?\[ENDX\].*\n' infile

那是:

grep -Pzo '.*BEGINNING(.|\n)*?MIDDLE(.|\n)*?END.*\n' infile
$ cat tst.awk
BEGIN {
   beg = "[BEGINX]"
   mid = "[First-string-i-search-for]"
   end = "[ENDX]"
}
index($0,beg) {
   gotBeg = 1
   gotMid = 0
   buf = ""
}
gotBeg {
   buf = buf $0 ORS
   if ( index($0,mid) ) {
       gotMid = 1
   }
   if ( index($0,end) ) {
       if ( gotMid ) {
           printf "%s", buf
       }
       gotBeg = 0
   }
}
$ awk -f tst.awk file
...[BEGINX]
some log a
<several-1000-lines>
...[First-string-i-search-for]
<several-1000-lines>
some log b
...[ENDX]

以上假設:

  1. 您要搜尋的 3 個字元串總是出現在彼此不同的行上。
  2. 您總是希望從最後一個 BEGINX 到它之後的第一個 ENDX 進行測試。

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