ログを調査するために、ワークフローで最初に悪用された脆弱性を見つけようとしました。
パターンは複数行にあります。
パターンは次のとおりです。
AAAAAAAAA
BBBBBBBBB
CCCCCCCCC
問題は
AAAAAAAAA
または
BBBBBBBBB
または
CCCCCCCCC
脆弱性を表示せずにログのどこにでも個別に見つけることができます。これらの正確な順序のパターンが役立ちます。
例えば
grep -Ei "AAAAAAAAA|BBBBBBBBB|CCCCCCCCC" logfile
個別に表示されるすべての行がAAAAAAAAA BBBBBBBBB CCCCCCCCC
そこにあるので、私には役立ちません。
この問題をどのように解決できますか?
答え1
Pythonでは、次のことができます。 (ログファイルがAAAAAAAAA、BBBBBBBBB、またはCCCCCCCCCCのいずれかの行に散在していても、目的の一致を取得できることを示すために、例に少し追加しました。)
以下は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