在大日志文件中的多行上查找模式

在大日志文件中的多行上查找模式

为了在日志中进行调查,我试图找到工作流程中第一次被利用的漏洞。

该图案位于多行上。

模式将是

AAAAAAAAA
BBBBBBBBB
CCCCCCCCC

问题是

AAAAAAAAA

或者

BBBBBBBBB

或者

CCCCCCCCC

可以在日志中的任何位置单独找到,而不显示漏洞;正是这种精确顺序的精确模式对我有帮助。

例如

grep -Ei "AAAAAAAAA|BBBBBBBBB|CCCCCCCCC" logfile对我没有帮助,因为所有单独出现的线条AAAAAAAAA BBBBBBBBB CCCCCCCCC都会在那里。

我该如何解决这个问题?

答案1

您可以在 python 中执行以下操作(我在您的示例中添加了一些内容,以证明您仍然可以获得所需的匹配项,即使日志文件中散布着 AAAAAAAAA、BBBBBBBBB 或 CCCCCCCCC 的随机单行):

以下是 find_log_vulns.py 的内容

#! /usr/bin/python3

import re

test_string = """1234324
AAAAAAAAA
BBBBBBBBB
CCCCCCCCC
absdfjv4er4
AAAAAAAAA
BBBBBBBBB
CCCCCCCCC
123466666
AAAAAAAAA
ghrhvhhhfh
BBBBBBBBB
fjwjefjsjfjwjf
CCCCCCCCC
24wfsgggg
AAAAAAAAA
BBBBBBBBB
CCCCCCCCC
zzzz"""

matches = re.findall('AAAAAAAAA\nBBBBBBBBB\nCCCCCCCCC\n', test_string, re.MULTILINE)

print(matches)

我运行上面得到的结果:

$ ./find_log_vulns.py
['AAAAAAAAA\nBBBBBBBBB\nCCCCCCCCC\n', 'AAAAAAAAA\nBBBBBBBBB\nCCCCCCCCC\n', 'AAAAAAAAA\nBBBBBBBBB\nCCCCCCCCC\n']

如上所示,每个匹配项都将作为列表中的元素返回。

答案2

使用 ripgrep:

rg -U 'A+\nB+\nC+' in
2:AAAAAAAAA
3:BBBBBBBBB
4:CCCCCCCCC
6:AAAAAAAAA
7:BBBBBBBBB
8:CCCCCCCCC
16:AAAAAAAAA
17:BBBBBBBBB
18:CCCCCCCCC

你可以去掉行号等等。如果您需要匹配之间的分隔符,您可以这样做:

rg -U 'A+\nB+\nC+' in | rg --passthru -e '(^A)' -r $'\n'A

AAAAAAAAA
BBBBBBBBB
CCCCCCCCC

AAAAAAAAA
BBBBBBBBB
CCCCCCCCC

AAAAAAAAA
BBBBBBBBB
CCCCCCCCC

答案3

使用awk

awk -v ptrn="AAAAAAAAA\0BBBBBBBBB\0CCCCCCCCC\0" '
BEGIN{ split(ptrn, tmp, "\0"); lngth=gsub("\0", "", ptrn ) }
$0 ~ tmp[++fieldNr]{ buf=(buf==""?"": buf OFS) NR":"$0 ;
                     if ( fieldNr == lngth ) { print buf; exit }
                     next
                   }
{ fieldNr=0; buf="" }' infile

这将为您提供行号,后跟匹配的行内容;在这里,我们使用“部分正则表达式匹配”,使用“PTRN“ 违反规定。参见如何找到与模式匹配的文本?以获得其他匹配选项。

我们使用 NUL 字符\0来分隔模式。


输入示例:

AAAAAAAAA
BBBBBBBBB

CCCCCCCCC
AAAAAAAAA
BBBBBBBBB
ccccccccc
123AAAAAAAAA
BBBBBBBBB123
123CCCCCCCCC3

输出:

8:123AAAAAAAAA 9:BBBBBBBBB123 10:123CCCCCCCCC3

答案4

只是为了和老好人一起玩awk

cat file | wc -l
21287021

超过 3000,000 场比赛

time awk 'BEGIN{getline; a=$0; getline; b=$0}
       $0~/^C+$/ && a~/^A+$/ && b~/^B+$/{print "match starting on line "NR-2 }{a=b;b=$0}' file

real    0m12.644s
user    0m7.149s
sys     0m4.314s

rg与我的机器上相比

time rg -U 'A+\nB+\nC+' file
real    0m40.322s
user    0m16.503s
sys     0m17.246s

相关内容