Chcę do tail -fmoich dzienników. Chcę jednak odfiltrować wszystko, co zawiera słowa:
„ELB”, „Pingdom”, „Health”
Chcę do tail -fmoich dzienników. Chcę jednak odfiltrować wszystko, co zawiera słowa:
„ELB”, „Pingdom”, „Health”
Odpowiedzi:
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
egrepifgrepsą dostępne.egrepjest taki sam jakgrep -E.fgrepjest taki sam jakgrep -F. Bezpośrednie wywołanie jak alboegrepczyfgrepjest 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.
grep -Ezamiast egrepuzasadnienia duplikatu?
sed, awk, perl, multitaillub ninja_foo.
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.
Dlaczego chcesz zalogować te informacje?
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?