Comment grep 2 ou 3 lignes, une contenant le texte que je veux, et les autres juste en dessous?

32

Voici un instantané du journal des erreurs:

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)

Je fais la commande suivante:

cat foo.log | grep ERROR pour obtenir un OP comme:

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

Quelle commande dois-je exécuter pour obtenir la sortie en tant que

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

c'est-à-dire, également grep la ligne (s) après le motif?

theTuxRacer
la source
Le com.rabbitmq.clienttexte de la ligne suivante commence-t-il depuis le début ou contient-il des espaces devant lui?
Eugen Konkov

Réponses:

62

Faites juste un:

grep -A1 ERROR

Le -A1dit à grep d'inclure 1 ligne après le match. -Binclut des lignes avant le match, au cas où vous en auriez besoin.

Jeremy Kerr
la source
oh oui, ce serait utile aussi.
theTuxRacer
12
Et -Ccomprend des lignes avant et après le match (le «C» signifie «contexte», je crois).
Marius Gedminas
5

Pour un moyen plus portable, il y a awk

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

Ou peut-être voulez-vous que toutes les lignes en retrait suivent?

awk '/^[^[:blank:]]/{p=0} /ERROR/{p=1} p' foo.log
geirha
la source
2
: O c'est une bonne information, mais plutôt exagéré! néanmoins, il est bon de connaître une méthode différente :)
theTuxRacer
Je souhaite avoir compris comment ces awkcommandes fonctionnent.
Firefeather
3
@Firefeather awk.freeshell.org est une bonne ressource pour apprendre awk. La page de manuel de GNU awk est également très bonne.
geirha
1

J'ai trouvé cette solution:

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

(\n(?=\s).*?)*signifie:

  • \n trouver la ligne suivante
  • (?=\s) où est le caractère blanc
  • .*? jusqu'à la fin de la ligne
  • (...)* Trouver de telles lignes plusieurs fois

PS Vous pouvez appliquer ce motif \ncom\.rabbitmq.*?si la deuxième ligne commence à partir d'un espace\s

Eugen Konkov
la source