Поиск шаблона в нескольких строках в БОЛЬШИХ файлах журнала

Согласно в этом ответе SO , archпроводится различие между PowerPC(ppc)и Intel (i386), а не между 32-битным -и 64-битным -ядром на x86. Таким образом, в этом контексте i386означает процессор x86.

Проверьте вывод uname -m, чтобы узнать тип вашей машины. (В Linux archэквивалентно uname -m.)

См. также этот раздел вопросов и ответов .

2
04.04.2021, 13:36
4 ответа

Вот как вы можете сделать это на питоне (Я немного добавил к вашему примеру, чтобы доказать, что вы все еще можете получить нужные совпадения, даже если есть случайные отдельные строки 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']

Как показано выше, каждое совпадение будет возвращено как элемент списка.

1
28.04.2021, 22:54

с помощью 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
1
28.04.2021, 22:54

Использование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
1
28.04.2021, 22:54

Просто по приколу со старыми добрыми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
0
28.04.2021, 22:54

Теги

Похожие вопросы