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

27

Ceci est 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 en tant que:

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

Quelle commande dois-je exécuter pour obtenir la sortie sous la forme

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.-à-d., placez également la ou les lignes après le motif?

    
posée theTuxRacer 24.02.2011 - 07:02
la source

3 réponses

49

Faites juste un:

grep -A1 ERROR

Le -A1 dit à grep d'inclure une ligne après le match. -B inclut les lignes avant le match, au cas où vous en auriez besoin également.

    
réponse donnée Jeremy Kerr 24.02.2011 - 07:26
la source
5

Pour une manière plus portable, il y a des peurs

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
    
réponse donnée geirha 24.02.2011 - 09:46
la source
1

J'ai trouvé cette solution:

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

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

  • \n trouve la ligne suivante
  • (?=\s) où commence le caractère d'espacement
  • .*? jusqu'à la fin de la ligne
  • (...)* Trouvez ces lignes plusieurs fois

PS. Vous pouvez modifier ce modèle \ncom\.rabbitmq.*? si la deuxième ligne commence par des espaces \s

    
réponse donnée Eugen Konkov 11.11.2016 - 10:07
la source

Lire d'autres questions sur les étiquettes