tail -f path
Powyższe spowoduje natychmiastowe zmodyfikowanie pliku, ale chcę zastosować filtr do pliku wyjściowego, pokaże się tylko, gdy znajdzie się xxx
w nim słowo kluczowe .
Jak do tego podejść?
tail -f path
Powyższe spowoduje natychmiastowe zmodyfikowanie pliku, ale chcę zastosować filtr do pliku wyjściowego, pokaże się tylko, gdy znajdzie się xxx
w nim słowo kluczowe .
Jak do tego podejść?
Odpowiedzi:
Dzięki Uniksowi możesz przesyłać dane wyjściowe z jednego programu do drugiego.
Aby przefiltrować ogon, możesz użyć grep:
tail -f path | grep your-search-filter
Krótka odpowiedź: tail -f somefile | grep somepattern
Jednak zwykle nie wystarcza. Załóżmy, że dostosowujesz plik, który jest często obracany (jeśli jest to dziennik debugowania, może być obracany wiele razy). W takim razie tail -F
jest twoim przyjacielem. Pozwolę ci sprawdzić różnicę.
Ale tail -f
i tail -F
wydrukuj najpierw kilka linii, co często jest niepożądane w tym przypadku użycia, więc w tym przypadku dodaj-n0
tail -F -n0 somefile | grep somepattern
Będzie dobrze, dopóki nie będziesz chciał wykonać innego filtrowania, a potem musisz wystrzegać się buforowania. stdout jest domyślnie buforowany liniowo podczas zapisywania na terminalu, ale podczas pełnego buforowania podczas zapisywania na potoku. Tak więc następujące wyemitują linie, gdy tylko zostaną znalezione, ponieważ tail
są jawnie buforowane w linii (lub opróżniają swoje wyjście na końcu każdej linii), a grep
także są buforowane w linii, ponieważ ich dane wyjściowe trafiają do twojego terminala:
tail -F -n0 somefile | grep somepattern
Ale wtedy decydujesz się użyć czegoś podobnego awk
lub cut
do dalszego przetworzenia wyniku.
tail -F -n0 somefile | grep somepattern | awk '{print $3}'
A teraz zastanawiasz się, dokąd poszedł twój wynik ... w zależności od ilości dzienników, może się okazać, że dostajesz wyjście, ale będzie to strona na raz, ponieważ teraz standardowe wyjście grep
działa w pełni buforowany sposób, i tak awk
odbiera wejściowo 4kB na raz (domyślnie).
W takim przypadku możesz grep
ustawić --line-buffered
opcję buforowania linii standardowej za pomocą opcji.
tail -F -n0 somefile | grep --line-buffered somepattern | ...
Jednak większość poleceń nie ma odpowiednika --line-buffered
. W przypadku bardziej skryptowalnych narzędzi można użyć funkcji do wypłukania danych wyjściowych (np. W awk
, funkcja jest fflush()
, która ma taką samą nazwę jak jej odpowiednik C, narzędzia takie jak Perl i Python mają coś podobnego).
Z takimi jak cut
ty prawdopodobnie nie masz szczęścia; ... ale możesz spróbować wyszukać unbuffer
, co wydaje mi się, że coś zapewnia expect
łańcuch narzędzi (nigdy tego nie używałem).
Mam nadzieję, że uznasz to za przydatne.
Pozdrawiam, Cameron
i możesz używać wielu potoków i grepów, a także wykluczać rzeczy za pomocą grep -v, uzyskać niewrażliwość na wielkość liter za pomocą grep -i itp.
tj .: tail -100f / var / log / messages | grep -V ACPI | grep -i ata
rozpocznij tailing 100 linii od końca i kontynuuj tailing, najpierw wyklucz wszystkie linie z ACPI, a następnie pokaż linie z ata, ATA lub dowolną ich kombinacją.
Kolejną przydatną są opcje ABC dla linii Po, Przed i Kontekst (linie przed i po).