Come grep 2 o 3 righe, una contenente il testo che voglio e le altre appena sotto di essa?


32

Questa è un'istantanea del registro errori:

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)

Faccio il seguente comando:

cat foo.log | grep ERROR ottenere un PO come:

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

Quale comando devo eseguire per ottenere l'output come

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

cioè, grep anche la linea (e) dopo il modello?


Il com.rabbitmq.clienttesto sulla riga successiva inizia dall'inizio o ha degli spazi davanti?
Eugen Konkov,

Risposte:


62

Basta fare un:

grep -A1 ERROR

La -A1dice grep per includere 1 riga dopo la partita. -Binclude le righe prima della partita, nel caso sia necessario anche quello.


oh giusto, sarebbe utile anche questo.
theTuxRacer,

12
E -Cinclude linee sia prima che dopo la partita (la "C" sta per "contesto", credo).
Marius Gedminas,

5

Per un modo più portatile, c'è awk

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

O forse vuoi che seguano tutte le righe rientrate?

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

2
: O questa è una buona informazione, ma piuttosto eccessiva! tuttavia, è bene conoscere un metodo diverso :)
theTuxRacer,

Vorrei aver capito come funzionano quei awkcomandi.
Firefeather

3
@Firefeather awk.freeshell.org è una buona risorsa per l'apprendimento di awk. Anche la pagina del manuale di GNU awk è abbastanza buona.
Geirha,

1

Ho trovato questa soluzione:

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

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

  • \n trova la riga successiva
  • (?=\s) dove si trova il carattere degli spazi bianchi
  • .*? fino alla fine della linea
  • (...)* Trova tali righe più volte

PS. Puoi sviluppare questo schema\ncom\.rabbitmq.*? se la seconda riga inizia dallo spazio bianco\s

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.