Как получить 2 или 3 строки, одна из которых содержит текст, который я хочу, а другие чуть ниже?

Это снимок журнала ошибок:

06:16:29,933 ERROR EmailRMManager$:45 - Exception In get Message
com.rabbitmq.client.AlreadyClosedException: clean connection shutdown; reason: Attempt to use closed channel
    at com.rabbitmq.client.impl.AMQChannel.ensureIsOpen(AMQChannel.java:195)
    at com.rabbitmq.client.impl.AMQChannel.rpc(AMQChannel.java:222)
    at com.rabbitmq.client.impl.AMQChannel.rpc(AMQChannel.java:208)
    at com.rabbitmq.client.impl.AMQChannel.exnWrappingRpc(AMQChannel.java:139)
    at com.rabbitmq.client.impl.ChannelN.basicGet(ChannelN.java:645)

Я выполняю следующую команду:

cat foo.log | grep ERROR, чтобы получить OP как:

06:16:29,933 ERROR EmailRMManager$:45 - Exception In get Message

Какую команду я должен выполнить, чтобы получить вывод в виде

06:16:29,933 ERROR EmailRMManager$:45 - Exception In get Message
    com.rabbitmq.client.AlreadyClosedException: clean connection shutdown; reason: Attempt to use closed channel

, т. Е. Также выполнить поиск строки (строк) после шаблона?

32
задан 24 February 2011 в 09:02

4 ответа

Я нашел это решение:

cat apache.error.log | grep -Pzo '^.*?Exception In get Message.*?\ncom\.rabbitmq.*?(\n(?=\s).*?)* 

Где (\n(?=\s).*?)* означает:

  • \n найти следующую строку
  • (?=\s) где начинается с пробела
  • .*? до конца строки
  • (...)* Найти такие строки несколько раз

PS. Вы можете изменить этот шаблон \ncom\.rabbitmq.*?, если вторая строка начинается с пробела \s

Где (\n(?=\s).*?)* означает:

  • \n найти следующую строку
  • (?=\s) где начинается с пробела
  • .*? до конца строки
  • (...)* Найти такие строки несколько раз

PS. Вы можете изменить этот шаблон \ncom\.rabbitmq.*?, если вторая строка начинается с пробела \s

0
ответ дан 24 February 2011 в 09:02

Просто сделайте a:

grep -A1 ERROR

-A1 говорит grep, что нужно включить 1 строку после матча -B содержит строки перед матчем, если вам это тоже нужно.

0
ответ дан 24 February 2011 в 09:02

Для более переносимого способа есть awk

awk '/ERROR/{n=NR+1} n>=NR' foo.log

Или, может быть, вы хотите, чтобы все строки с отступами следовали?

awk '/^[^[:blank:]]/{p=0} /ERROR/{p=1} p' foo.log
0
ответ дан 24 February 2011 в 09:02

Для этой простой задачи есть простой способ:

grep -A num
Print num lines of trailing context after each match. See also the -B and -C options.

grep -B num
Print num lines of leading context before each match. See also the -A and -C options.

grep -C num
Print num lines of leading and trailing context surrounding each match.
The default is 2 and is equivalent to -A 2 -B 2. 

Примечание: между параметром и его аргументом не должно быть пробелов.

1
ответ дан 13 October 2020 в 11:43

Другие вопросы по тегам:

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