Я хочу разбить файл журнала на части, а затем искать в этих частях ошибки. Если есть ошибка, я хочу поместить соответствующую часть файла журнала в другой файл.
Маленький пример:
Лог-файл выглядит так:
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