2012-11-23 6 views
27

Z grep Wiem, jak ustawić kontekst na stałą liczbę linii. Czy jest możliwe pokazanie kontekstu na podstawie dowolnego warunku łańcucha znaków, np. Ustawienia kontekstu po "do następnej pustej linii"?Jak ustawić grep po kontekście, aby był "do następnej pustej linii"?

A może jakaś inna kombinacja narzędzi?

Zasadniczo mam plik dziennika ciągłych liniach, z pustymi liniami oddzielającymi „wydarzeń” Chcę, aby wyszukać ciąg znaków w pliku dziennika, ale pokazują całą imprezę ....

+0

Jest to możliwe z innymi narzędziami. Jeśli napiszesz przykład, otrzymasz konkretne odpowiedzi. –

+0

Prawdopodobnie chcesz użyć 'sed' lub' awk' do tego ... – dmckee

+0

Jak mogę zrobić odwrotność tego. Mam plik dziennika ze stosu wywołań. Nie chcę drukować stosu wywołań, ale chcę mieć wszystkie inne stosy wywołań – Nikole

Odpowiedz

24

Brzmi jak trzeba sed:

sed -n '/pattern/,/^$/p' file 

nie drukuj domyślnie (-n). Dla linii pasujących do /pattern/ do pustej linii /^$/, wydrukuj.

+0

Należy zauważyć, że to nie pokazuje całego zdarzenia, ale pomija te linie zdarzenia poprzedzającego wzorzec. –

+2

Aby wyczyścić: Polecenie ma format ", ". Wyszukuje zakresy adresów (zakresy linii) zaczynając od dopasowania "wzorca" i kończąc na dopasowaniu następnej pustej linii (pasującej do '^ $'). Dla każdej funkcji zakresu wykonywana jest funkcja ('p': drukowanie linii przychodzących). Aby wykluczyć puste wiersze z danych wyjściowych, użyj 'sed -n '/ pattern /,/^ $/{/^$ /! P}' file'. Tutaj '/^$ /! P' oznacza wydruk dowolnej linii przychodzącej nie pasującej do'^$ '. – valid

+1

To działało idealnie dla mnie, z jednym wyjątkiem: moje wejście źródłowe miało nowe linie w stylu DOS (\ r \ n), więc musiałem to zrobić zamiast: 'sed -n '/ pattern /,/^ \ r $/p "plik" – bmaupin

7

Oto (testowane) awk rozwiązanie, rozdzielone na wiele wierszy dla czytelności:

awk '/pattern/ {do_print=1} 
    do_print==1 {print} 
    NF==0 {do_print=0}' input_file 

Skrypt ten będzie również wydrukować pusty wiersz więc łatwiej jest oddzielić różne wizualnie dopasowane bloki. Jeśli nie chcesz pusty wiersz, zamienić 2 linii do_print==1 {print} i NF==0 {do_print=0}

wyjaśnienie:

  • awk: Wywołaj narzędzie awk - ocenia wejściowego jeden wiersz w kolejno czasu.
  • '...'.: wszystko, co zawiera pojedyncze cytaty, jest przekazywane zgodnie z instrukcją jako awk. W takim przypadku wykonujemy cytowane instrukcje w każdym wierszu.
  • /pattern/ {do_print=1}: ilekroć linia zawiera „pattern” włącz do_print flagą
  • do_print==1 {print}: jeśli flaga do_print jest włączona, drukowanie bieżącej linii.
  • NF==0 {do_print=0}: NF oznacza Number of Fields. awk ogranicza domyślnie każdą linię spacjami i tabulatorami, aby podzielić linię na pola. W tym przypadku trywialnie pusty wiersz nie ma pola - więc wyłączyć flagę do_print aby zatrzymać drukowanie, gdy widzimy linię z NF == 0
18

Prostym rozwiązaniem jest:

awk '/pattern/' RS= input-file 

ustawień RS do pusty ciąg powoduje, że awk traktuje puste linie jako separator rekordów, a prosta reguła /pattern/ powoduje, że awk wypisze dowolny rekord pasujący do wzorca, którym może być dowolne rozszerzone wyrażenie regularne.