大容量ログファイルの複数行でパターンを検索する

大容量ログファイルの複数行でパターンを検索する

ログを調査するために、ワークフローで最初に悪用された脆弱性を見つけようとしました。

パターンは複数行にあります。

パターンは次のとおりです。

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

関連情報