如何grep 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
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
也就是说,在模式之后还要grep这些线?
做一个:
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
我找到了这个解决方案:
cat apache.error.log | grep -Pzo '^.*?Exception In get Message.*?\ncom\.rabbitmq.*?(\n(?=\s).*?)*$'
其中(\n(?=\s).*?)*
表示:
-
\n
找到下一行 -
(?=\s)
where从空格字符开始 -
.*?
直到行尾 -
(...)*
多次找到这样的行
PS。 你可以\ncom\.rabbitmq.*?
这种模式\ncom\.rabbitmq.*?
如果第二行从空格开始