Как получить 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 чтобы получить ОП как:

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

т. е. также отображать строки после шаблона?

3 ответа

Решение

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

grep -A1 ERROR

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

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

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

Или, может быть, вы хотите, чтобы все отступы были следующими

awk '/^[^[:blank:]]/{p=0} /ERROR/{p=1} p' foo.log

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

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. 

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

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

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

куда (\n(?=\s).*?)* средства:

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

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

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