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 le résultat
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 aussi grep la ou les lignes après le motif?
Il suffit de faire un:
grep -A1 ERROR
Le -A1
indique à grep d'inclure une ligne après la correspondance. -B
inclut des lignes avant la correspondance, au cas où vous en auriez aussi besoin.
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
J'ai trouvé cette solution:
cat Apache.error.log | grep -Pzo '^.*?Exception In get Message.*?\ncom\.rabbitmq.*?(\n(?=\s).*?)*$'
Où (\n(?=\s).*?)*
signifie:
\n
cherche la ligne suivante(?=\s)
où est à partir d'un caractère d'espacement.*?
jusqu'à la fin de la ligne(...)*
Trouver ces lignes plusieurs foisPS Vous pouvez modifier ce modèle \ncom\.rabbitmq.*?
si la deuxième ligne commence par un espace \s