Ich versuche, eine Protokolldatei nach protokollierten Aktivitäten zu durchsuchen, die nicht abgeschlossen wurden. Zum Beispiel protokolliere ich eine "Startaktivität für ID 1234 ..." und bei Erfolg lautet die nächste Zeile "Aktivität 1234 abgeschlossen".
Ich versuche, die Zeilen "Starting ..." abzurufen, denen NICHT die entsprechenden Zeilen "Completed" folgen.
Beispielprotokolldatei
Starting activity for ID 1234
ID 1234 completed successfully
Starting activity for ID 3423
ID 3423 completed successfully
Starting activity for ID 9876
ID 9876 completed successfully
Starting activity for ID 99889
ID 99889 completed successfully
Starting activity for ID 10011
ID 10011 completed successfully
Starting activity for ID 33367
Starting activity for ID 936819
ID 936819 completed successfully
In diesem Beispiel würde ich nach der Ausgabe suchen:
Starting activity for ID 33367
... weil es keine "abgeschlossene" Zeile gibt.
Ich habe versucht, dies mit grep
und zu tun awk
, hatte aber nicht viel Erfolg. Ich gehe davon aus, dass dies mit einem dieser Tools möglich ist, aber my grep
und awk
chops sind nicht fortgeschritten.
Suchen Sie eine schnelle und zuverlässige grep
oder awk
Muster , die Ergebnisse zu geben , die ich hier brauchen.
Antworten:
Hier ist eine
awk
Alternative:Ausgabe:
Das
I
assoziative Array verfolgt, welche IDs gesehen wurden.quelle
I[$5] = 1
Sie können also stattdessen einfach verwendenI[$5]
. (Sie interessieren sich nicht für den Wert, Sie möchten nur das Element vorhanden machen , und durch einfaches Benennen wird dies erreicht.)Dies wird von dem Ausgang alle Eingabezeilen löschen , die durch eine Linie nicht gefolgt passen die Zeichenfolge abgeschlossen .
quelle
So können Sie es mit GNU sed machen:
N
Liest eine weitere Zeile in den Musterraum.d
) und der Zyklus neu gestartet.P
) und löschen Sie sie (D
).quelle
-r
wird es nicht benötigt, oder?+
Quantifizierer.Wenn Ihre Installation pcregrep unterstützt, ist die Option "Multiline (-M)" hilfreich.
Startaktivität für ID 33367
quelle