与linux匹配的相对日志文件?

lee*_*d00 0 grep vim logs awk

我已经知道如何使用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>
Run Code Online (Sandbox Code Playgroud)

然后我会在搜索后得到这样的输出[First-string-i-search-for]

...[BEGINX]
some log a
<several-1000-lines>
...[First-string-i-search-for]
<several-1000-lines>
some log b
...[ENDX]
Run Code Online (Sandbox Code Playgroud)

Ed *_*ton 6

$ 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
    }
}
Run Code Online (Sandbox Code Playgroud)

$ awk -f tst.awk file
...[BEGINX]
some log a
<several-1000-lines>
...[First-string-i-search-for]
<several-1000-lines>
some log b
...[ENDX]
Run Code Online (Sandbox Code Playgroud)

以上假设:

  1. 您要搜索的 3 个字符串总是出现在彼此不同的行上。
  2. 您总是希望从最后一个 BEGINX 到它之后的第一个 ENDX 进行测试。