대용량 로그 파일의 여러 줄에서 패턴 찾기

대용량 로그 파일의 여러 줄에서 패턴 찾기

로그를 조사하기 위해 워크플로에서 처음으로 악용된 취약점을 찾으려고 노력했습니다.

패턴이 여러 줄에 있습니다.

패턴은 다음과 같습니다

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

3,000,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

관련 정보