如何grep 2或3行,其中一行包含我想要的文本,而另一行仅位于文本下方?


32

这是错误日志的快照:

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

即也grep模式后的行?


com.rabbitmq.client下一行上的文本是从开头开始还是前面有空格?
Eugen Konkov '16

Answers:



5

对于更便携的方式,有awk

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

或者,也许您希望所有缩进的行都跟随?

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

2
:O那是很好的信息,但是矫over过正!尽管如此,很高兴知道一种不同的方法:)
theTuxRacer

我希望我了解这些awk命令的工作方式。
Firefeather 2011年

3
@Firefeather awk.freeshell.org是学习awk的好资源。GNU awk手册页也相当不错。
盖尔哈2011年

1

我找到了这个解决方案:

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

其中(\n(?=\s).*?)*

  • \n 找到下一行
  • (?=\s) 从空格字符开始
  • .*? 直到行尾
  • (...)* 多次找到这样的行

PS。\ncom\.rabbitmq.*?如果第二行从空格开始,则可以草草处理此模式\s

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.