Wie greife ich zu 2 oder 3 Zeilen, von denen eine den gewünschten Text enthält und die anderen direkt darunter?


32

Dies ist eine Momentaufnahme des Fehlerprotokolls:

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)

Ich mache den folgenden Befehl:

cat foo.log | grep ERROR um ein OP zu bekommen als:

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

Welchen Befehl soll ich ausführen, um die Ausgabe als zu erhalten?

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

dh grep auch die Zeile (n) nach dem Muster?


Ist com.rabbitmq.clientText auf der nächsten Zeile beginnt mit dem begginning oder haben einige Räume vor ihm?
— Eugen Konkov

Antworten:


62

Mach einfach ein:

grep -A1 ERROR

Das -A1fordert grep auf, 1 Zeile nach dem Match einzuschließen. -Bschließt Zeilen vor dem Spiel ein, falls Sie das auch brauchen.


ach ja, das wäre auch hilfreich.
— theTuxRacer

12
Und -Cschließt Zeilen sowohl vor als auch nach dem Spiel ein (das "C" steht, glaube ich, für "Kontext").
— Marius Gedminas

5

Für eine tragbarere Art gibt es awk

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

Oder möchten Sie, dass alle eingerückten Zeilen folgen?

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

2
: O das ist eine gute Information, aber eher übertrieben! Trotzdem ist es gut, eine andere Methode zu kennen :)
— theTuxRacer

Ich wünschte, ich hätte verstanden, wie diese awkBefehle funktionieren.
— Firefeather

3
@Firefeather awk.freeshell.org ist eine gute Ressource zum Lernen von awk. Die GNU awk Manualpage ist auch ziemlich gut.
— Geirha

1

Ich habe diese Lösung gefunden:

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

Wo (\n(?=\s).*?)*bedeutet:

  • \n nächste Zeile finden
  • (?=\s) Wo beginnt das Leerzeichen?
  • .*? bis zum Zeilenende
  • (...)* Finde solche Zeilen mehrmals

PS. Sie können dieses Muster rasen, \ncom\.rabbitmq.*?wenn die zweite Zeile mit Leerzeichen beginnt\s

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.