Chcę do tail -f
moich dzienników. Chcę jednak odfiltrować wszystko, co zawiera słowa:
„ELB”, „Pingdom”, „Health”
Chcę do tail -f
moich 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ć egrep
zamiast grep -E
dla 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 -E
przełącznika. Jednak zgodnie ze stroną podręcznika GNU grep:
[…] Dwa warianty programów
egrep
ifgrep
są dostępne.egrep
jest taki sam jakgrep -E
.fgrep
jest taki sam jakgrep -F
. Bezpośrednie wywołanie jak alboegrep
czyfgrep
jest 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 -E
składni, ponieważ druga metoda jest oficjalnie przestarzała.
grep -E
zamiast egrep
uzasadnienia duplikatu?
sed
, awk
, perl
, multitail
lub 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 multitail
robi 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?