Awk
與linux匹配的相對日誌文件?
我已經知道如何使用
grep
或awk
匹配日誌文件中的某些內容,但是有沒有辦法執行以下操作?
- 匹配文件中的特定行…並將其包含在結果中。
- 從文件中 (1.) 中的匹配行開始,直到匹配到第二個字元串並將其包括在結果中的所有行。
- 然後使用第三個匹配項從匹配項 (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]
以上假設:
- 您要搜尋的 3 個字元串總是出現在彼此不同的行上。
- 您總是希望從最後一個 BEGINX 到它之後的第一個 ENDX 進行測試。