M BUZZ CRAZE NEWS
// general

How to grep 2 or 3 lines, one containing the text I want, and the others just below it?

By Jessica Wood

This is a snapshot of error log:

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)

I do the following command:

cat foo.log | grep ERROR to get an OP as:

06:16:29,933 ERROR EmailRMManager$:45 - Exception In get Message

What command should I execute to get the output as

06:16:29,933 ERROR EmailRMManager$:45 - Exception In get Message com.rabbitmq.client.AlreadyClosedException: clean connection shutdown; reason: Attempt to use closed channel

ie, also grep the line(s) after the pattern?

1

4 Answers

Just do a:

grep -A1 ERROR

The -A1 tells grep to include 1 line after the match. -B includes lines before the match, in case you need that too.

3

For a more portable way, there's awk

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

Or maybe you want all the indented lines following?

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

I have found this solution:

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

Where (\n(?=\s).*?)* means:

  • \n find next line
  • (?=\s) where is starts from whitespace character
  • .*? until end of line
  • (...)* Find such lines multiple times

PS. You may turf this pattern \ncom\.rabbitmq.*? if second line begins from whitespace \s

For this simple task a simple way is:

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. 

Note: no whitespace may be given between the option and its argument.

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy