40 votes

Comment extraire 2 ou 3 lignes, l'une contenant le texte souhaité et les autres juste en dessous ?

Ceci est un aperçu du journal des erreurs :

06:16:29,933 ERREUR EmailRMManager$:45 - Exception Dans getMessage
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 ERREUR pour obtenir un OP comme :

06:16:29,933 ERREUR EmailRMManager$:45 - Exception Dans getMessage

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

06:16:29,933 ERREUR EmailRMManager$:45 - Exception Dans getMessage
    com.rabbitmq.client.AlreadyClosedException: clean connection shutdown; reason: Attempt to use closed channel

ie, également rechercher la ou les ligne(s) après le motif ?

77voto

tags2k Points 11036

Il suffit de faire :

grep -A1 ERROR

Le -A1 indique à grep d'inclure 1 ligne après la correspondance. -B inclut les lignes avant la correspondance, au cas où vous en auriez besoin aussi.

5voto

Steve Karg Points 11

Pour une méthode plus portable, il y a awk

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

Ou peut-être voulez-vous toutes les lignes indentées suivantes ?

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

1voto

Eugen Konkov Points 636

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ù cela commence par un caractère d'espace blanc
  • .*? jusqu'à la fin de la ligne
  • (...)* Trouver ces lignes plusieurs fois

PS. Vous pouvez ignorer ce modèle \ncom\.rabbitmq.*? si la deuxième ligne commence par un espace blanc \s

1voto

Dimitrios Points 380

Pour cette tâche simple, une manière simple est la suivante :

grep -A num
Imprime num lignes de contexte suivant après chaque correspondance. Voir aussi les options -B et -C.

grep -B num
Imprime num lignes de contexte précédant avant chaque correspondance. Voir aussi les options -A et -C.

grep -C num
Imprime num lignes de contexte avant et après chaque correspondance.
Par défaut, c'est 2 et équivalent à -A 2 -B 2. 

Note : aucun espace ne doit être donné entre l'option et son argument.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X