如何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.*? 如果第二行从空格开始