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.