Próbuję wyszukać w pliku dziennika zarejestrowane działania, które nie zostały zakończone. Na przykład loguję „Aktywność początkowa dla ID 1234 ...”, a jeśli się powiedzie, w następnym wierszu będzie „Aktywność 1234 zakończona”.
Próbuję uzyskać wiersze „Początek ...”, po których NIE następują odpowiadające im wiersze „Ukończone”.
Przykładowy plik dziennika
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
W tym przykładzie szukałbym danych wyjściowych:
Starting activity for ID 33367
... ponieważ nie następuje po nim wiersz „ukończony”.
Próbowałem robić to z grep
a awk
, ale nie miał wiele sukcesów. Zakładam, że można to zrobić za pomocą jednego z tych narzędzi, ale moje grep
i awk
kotlety nie są zaawansowane.
Patrząc na szybkie i niezawodne grep
lub awk
wzoru dać wyniki muszę tutaj.
Odpowiedzi:
Oto
awk
alternatywa:Wynik:
I
Asocjacyjna śledzi co identyfikatory zostały zaobserwowane.źródło
I[$5] = 1
możesz po prostu użyćI[$5]
. (Nie zależy ci na wartości, po prostu chcesz, aby element istniał , a wystarczy nazwać go, aby to osiągnąć.)Spowoduje to usunięcie z wyjścia wszystkich wierszy wejściowych, po których nie ma wiersza pasującego do zakończonego ciągu .
źródło
Oto, jak możesz to zrobić z GNU sed:
N
wczytuje jeszcze jedną linię do przestrzeni wzorów.d
) i cykl jest restartowany.P
) i usuń go (D
).źródło
-r
nie jest to potrzebne, prawda?+
kwantyfikatorem.jeśli twoja instalacja obsługuje pcregrep, przydatna jest opcja multiline (-M).
Rozpoczęcie aktywności dla ID 33367
źródło