Разбить файл журнала на части и выполнить поиск ошибок

Разбить файл журнала на части и выполнить поиск ошибок

Я хочу разбить файл журнала на части, а затем искать в этих частях ошибки. Если есть ошибка, я хочу поместить соответствующую часть файла журнала в другой файл.

Маленький пример:

Лог-файл выглядит так:

STARTLOG1
blabla
more_blabla
ENDLOG1
STARTLOG2
ОШИБКА: Текст ошибки
Это ошибка
от пользователя XYZ
ENDLOG2
STARTLOG3
blabla
more_blabla
ENDLOG3

Я хочу разбить файл журнала на части. Все строки между STARTLOG и ENDLOG должны быть 1 частью. Когда в части появляется ошибка, извлеките всю часть в файл. Файл должен выглядеть так:

STARTLOG2
ERROR: Errortext
Это ошибка
от пользователя XYZ
ENDLOG2

решение1

Попробуй это:

$ awk -v RS="STARTLOG" '/ERROR/{print RS$0; }' log
STARTLOG2
ERROR: Errortext
This is an Error
from user XYZ
ENDLOG2

Чтобы перенаправить в файл с именем, logNгде N — номер STARTLOG, используйте:

gawk -v RS="STARTLOG" '/ERROR/{print RS$0 > "log"$1; }' log

Объяснение

RSявляется разделителем записей, это то, что определяет, что такое "строка" для awk. Здесь я устанавливаю его STARTLOGтак, чтобы вся запись рассматривалась как одна строка. Затем, если эта "строка" содержит ERROR, я печатаю STARTLOG( RSэто просто для воссоздания того же формата).

Тот же подход можно использовать и с Perl:

perl -lne 'BEGIN{$/="STARTLOG"}{print "$/$_" if /ERROR/}' log 

Связанный контент