Это снимок журнала ошибок:
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
, т. Е. Также выполнить поиск строки (строк) после шаблона?
Я нашел это решение:
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
Просто сделайте a:
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.
Примечание: между параметром и его аргументом не должно быть пробелов.