로그를 조사하기 위해 워크플로에서 처음으로 악용된 취약점을 찾으려고 노력했습니다.
패턴이 여러 줄에 있습니다.
패턴은 다음과 같습니다
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