¿Cómo grep 2 o 3 líneas, una que contiene el texto que quiero y las otras justo debajo de él?

32

Esta es una instantánea del registro de errores:

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)

Hago el siguiente comando:

cat foo.log | grep ERROR para obtener un OP como:

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

¿Qué comando debo ejecutar para obtener la salida como

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

es decir, también grep la línea (s) después del patrón?

theTuxRacer
fuente
¿El com.rabbitmq.clienttexto en la siguiente línea comienza desde el principio o tiene algunos espacios delante?
Eugen Konkov

Respuestas:

62

Solo haz un:

grep -A1 ERROR

El -A1le dice a grep que incluya 1 línea después del partido. -Bincluye líneas antes del partido, en caso de que también lo necesites.

Jeremy Kerr
fuente
oh cierto, eso también sería útil.
theTuxRacer
12
E -Cincluye líneas tanto antes como después del partido (la 'C' significa 'contexto', creo).
Marius Gedminas
5

Para una forma más portátil, hay awk

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

¿O tal vez quieres seguir todas las líneas sangradas?

awk '/^[^[:blank:]]/{p=0} /ERROR/{p=1} p' foo.log
geirha
fuente
2
: ¡Oh, esa es una buena información, pero es demasiado! no obstante, es bueno conocer un método diferente :)
theTuxRacer
Ojalá entendiera cómo funcionan esos awkcomandos.
Firefeather
3
@Firefeather awk.freeshell.org es un buen recurso para aprender awk. La página del manual de GNU awk también es bastante buena.
geirha
1

He encontrado esta solución:

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

Donde (\n(?=\s).*?)*significa:

  • \n encontrar la siguiente línea
  • (?=\s) donde se inicia desde el espacio en blanco
  • .*? hasta el final de la línea
  • (...)* Encuentra tales líneas varias veces

PD. Puede activar este patrón \ncom\.rabbitmq.*?si la segunda línea comienza desde el espacio en blanco\s

Eugen Konkov
fuente