如何 grep 2 或 3 行,其中一行包含我想要的文本,而其他行则在其下方?

the*_*cer 39 command-line bash grep

这是错误日志的快照:

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)
Run Code Online (Sandbox Code Playgroud)

我执行以下命令:

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
Run Code Online (Sandbox Code Playgroud)

即,还 grep 模式后的行吗?

Jer*_*err 75

只需做一个:

grep -A1 ERROR
Run Code Online (Sandbox Code Playgroud)

-A1告诉grep来包括在比赛后1号线。-B包括比赛前的行,以防您也需要。

  • 并且`-C`包括匹配前后的行(我相信'C'代表'context')。 (12认同)

gei*_*rha 5

对于更便携的方式,有 awk

awk '/ERROR/{n=NR+1} n>=NR' foo.log
Run Code Online (Sandbox Code Playgroud)

或者,也许您想要所有缩进的行?

awk '/^[^[:blank:]]/{p=0} /ERROR/{p=1} p' foo.log
Run Code Online (Sandbox Code Playgroud)

  • @Firefeather http://awk.freeshell.org/ 是学习 awk 的好资源。GNU awk 手册页也很不错。 (3认同)
  • :O 这是很好的信息,但有点矫枉过正!尽管如此,知道一种不同的方法是件好事:) (2认同)