Как получить 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