Использование sed для печати диапазона, когда шаблон находится внутри диапазона? - PullRequest
2 голосов
/ 17 марта 2011

У меня есть файл журнала, полный запросов, и я хочу видеть только те запросы, которые содержат ошибку.Записи в журнале выглядят примерно так:

path to file executing query
QUERY
SIZE: ...
ROWS: ...
MSG: ...
DURATION: ...

Я хочу напечатать все эти материалы, но только когда MSG: содержит что-то интересное (сообщение об ошибке).Все, что у меня сейчас есть, это sed -n '/^path to file/,/^DURATION/', и я не знаю, куда идти.

Примечание. Запросы часто бывают многострочными, поэтому использование grep -B, к сожалению, не всегда работает(это то, что я делал до сих пор, просто щедро со значением -B)

Каким-то образом я хотел бы использовать только sed, но если мне абсолютно необходимо использовать что-то еще, например awk Я думаю, это нормально.

Спасибо!

Ответы [ 3 ]

4 голосов
/ 17 марта 2011

Вы еще не сказали, как выглядит сообщение об ошибке, поэтому я предполагаю, что оно содержит слово «ОШИБКА»:

sed -n '/^MSG.*ERROR/{H;g;N;p;};/^DURATION/{s/.*//;h;d;};H' < logname

(хотелось бы, чтобы был более аккуратный способ очистки пространства удержанияКто-нибудь? ...)

1 голос
/ 17 марта 2011

Я мог бы предложить решение с grep.Это будет работать, если структура в файле журнала всегда будет такой же, как указано выше (т. Е. MSG находится в 5-й строке, а одна строка следует):

egrep -i '^MSG:.*error' -A 1 -B 4 logfile

Это означает:в строке MSG затем выведите блок, начиная с 4 строк до MSG до одной строки после него.Конечно, вы должны настроить регулярное выражение для распознавания ошибки.

Это не будет работать, если структура этих блоков отличается.

0 голосов
/ 17 марта 2011

Возможно, вы можете использовать сценарий cgrep.sed , как описано в Unix Power Tools book

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...