W tail -f, jak odfiltrować rzeczy, które zawierają określone słowa kluczowe?


Odpowiedzi:


58

Nie wiem o używaniu awk zamiast grep, ale to działa dla mnie:

tail -f file.log | grep -Ev '(ELB|Pingdom|Health)'

EDYCJA: Jak zauważyli dmourati i Caleb , możesz również użyć egrepzamiast grep -Edla wygody. W niektórych systemach będzie to łącze do tego samego pliku binarnego, w innych jego kopia dostarczona przez pakiet grep. Tak czy inaczej, stanowi alternatywę dla -Eprzełącznika. Jednak zgodnie ze stroną podręcznika GNU grep:

[…] Dwa warianty programów egrepi fgrepsą dostępne. egrepjest taki sam jak grep -E. fgrepjest taki sam jak grep -F. Bezpośrednie wywołanie jak albo egrepczy fgrepjest przestarzałe, ale jest warunkiem, aby umożliwić aplikacji historyczne, które opierają się na nich uruchomić niezmodyfikowanej.

Ponieważ są to polecenia synonimiczne, sprowadza się do preferencji, chyba że w ogóle nie masz egrep. Jednak ze względu na zgodność z poprzednimi wersjami zaleca się stosowanie grep -Eskładni, ponieważ druga metoda jest oficjalnie przestarzała.


Czy użycie grep -Ezamiast egrepuzasadnienia duplikatu?
Caleb

@Caleb Nie rozumiem, dlaczego nie. Jest więcej niż jeden sposób na
skórowanie

1
Tak, ale są to tylko dowiązania symboliczne, a nie dwa różne programy z pewnym nakładaniem się funkcji. Czy nie byłoby to bardziej „uzupełnieniem” (czytaj: komentarz), a nie pełnoprawną odpowiedzią? Głosowałem za mniejszymi przestępstwami ...
Marcin,

@DTest: Zgodnie z prawem, dmourati faktycznie pobiło mnie do ciosu o kilka sekund i chociaż nie wyjaśnił powodów, zasługuje tutaj na uznanie. Spóźniłeś się na imprezę, ponieważ obaj mieliśmy co najmniej dwa głosy poparcia, zanim przyszedłeś. Zmiana składni z dowiązania binarnego na argument jest zwykle czymś, do czego użyłbyś komentarza, a nie osobną odpowiedzią. Jeśli chcesz skórze kota inaczej wykorzystać sed, awk, perl, multitaillub ninja_foo.
Caleb

1
@DTest: Pozwoliłem sobie na znaczną modyfikację faktów w twojej odpowiedzi, aby dodać oryginalne źródła. Wygląda na to, że -E jest zalecane do użycia w przyszłości, więc zaznaczyłem to, ale usunąłem twoją notatkę o dystrybucjach, które nie mają egrep. Wspomniane dystrybucje mają egrep, to tylko oddzielny plik binarny zamiast dowiązania symbolicznego.
Caleb

21

Spróbuj go potokować, aby egrepować za pomocą rozdzielonych potokami list słów, które chcesz odfiltrować:

tail -f log_file | egrep -v 'ELB|Pingdom|Health'

Pamiętaj, że stosowanie nawiasów wokół listy dopasowań jest opcjonalne. Ponieważ |grep jest traktowany jako logiczny operator OR przez grep, niezależnie od tego, czy występuje jako część podgrupy. '(ELB|Pingdom|Health)'działałby dokładnie tak samo. Dla niektórych składnia może być bardziej oczywista; Łatwiej jest pisać bez, ponieważ mogę przełączyć się z pojedynczego dopasowania do listy możliwych dopasowań bez konieczności powrotu do dodania nawiasu.

Aby uzyskać dodatkowy kredyt, warto wspomnieć, że multitailrobi ninja foo, jeśli chodzi o filtrowanie wyników. Na przykład możesz odfiltrować takie słowa:

multitail -e ELB -e Pingdom -e Health -f log_file

Możesz także użyć go do pokolorowania lub innego podświetlenia wydruku zamiast po prostu go filtrować.

EDYCJA: Zobacz odpowiedź DTest i komentarze, aby uzyskać pełne wyjaśnienie, w jaki sposób egrep jest przestarzałym alternatywnym sposobem odpalenia grep -E.


2
czy wyrażenie nie powinno kończyć się na ('), a nie (")?
bbaja42

Tak, dziękuję, to była literówka. Na przyszłość, ponieważ strony wymiany stosów działają jak strony wiki, to jest coś, co można po prostu naprawić.
Caleb

Myślałem, że edycja musi zawierać więcej niż 6 znaków?
Sirex,

Jeśli nie masz wysokiego powtórzenia, tak, minimum 6 znaków, ale w tym przypadku 1 postać jest bardzo ważna. Możesz wymusić zmianę poprzez dodanie komentarza HTML do treści. Postacie będą się liczyć do limitu i możesz zauważyć, dlaczego dokonujesz zmiany.
Caleb

@Caleb bardzo dziękuje za sugestię na temat wielu bramek, jest niesamowity !! Nie mogę uwierzyć, że bez niego tak długo w życiu chodziłem.
sidewinderguy


3

Dlaczego chcesz zalogować te informacje?

  • Czy jest to wyłącznie archiwizacja?
  • Czy chcesz warunkowo wykonywać różne skrypty w zależności od różnych słów kluczowych lub wzorców w plikach dziennika?

Jeśli chcesz mieć zachowanie skryptowe w zależności od zawartości plików dziennika, możesz filtrować za pomocą funkcji Expect. ( http://en.wikipedia.org/wiki/Expect ) Expect to rozszerzenie Tcl, ale dostępna jest także wersja Expect w języku Python.

Oczekiwanie udostępnia tę potężną elastyczną instrukcję podobną do przełącznika, która pozwala warunkowo określać różne zachowania w zależności od stanów lub wzorców obecnych w strumieniu wejściowym. Na przykład:

expect {  
    "password:" {  
        send "password\r"  
    } 
    "yes/no)?" {  
        send "yes\r"  
        set timeout -1  
    }  
    timeout {  
        exit  
    }   
    -re . {  
        exp_continue  
    }  
    eof {  
        exit  
    }  
}

Więc określasz wzorce w instrukcji expect i określasz różne zachowania, i możesz zawinąć całość w pętlę, i możesz łatwo napisać bardzo potężne filtry, które również zapisują części twoich danych wejściowych do różnych plików, lub upuszczają je całkowicie, lub podejmuj działania i uruchamiaj inne skrypty w zależności od tego, co masz w danych wejściowych.

Wszystko sprowadza się do tego, dlaczego próbujesz filtrować pliki dziennika, podejmować działania na podstawie danych dziennika lub po prostu z przyczyn archiwalnych?


Plus jeden za odniesienie do Expect, z którego korzystałem już dawno i zupełnie o nim zapomniałem.
MPi
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.