Czy jest możliwe zrobienie tail -f
(lub podobnego) pliku i grep
jednocześnie? Nie miałbym nic przeciwko innym poleceniom, które tylko szukają tego rodzaju zachowania.
Czy jest możliwe zrobienie tail -f
(lub podobnego) pliku i grep
jednocześnie? Nie miałbym nic przeciwko innym poleceniom, które tylko szukają tego rodzaju zachowania.
Odpowiedzi:
Będzie działać dobrze; bardziej ogólnie, grep
poczeka, gdy program nie wyświetla danych wyjściowych, i będzie czytał dalej, gdy pojawi się wynik, więc jeśli to zrobisz:
$ (echo foo; sleep 5; echo test; sleep 5) | grep test
Nic się nie wydarzy przez 5 sekund, następnie grep wyświetli dopasowany „test”, a następnie pięć sekund później zakończy działanie, gdy zakończy się proces potokowy
Dodaj --line-buffered
do grep
, a to może zmniejszyć opóźnienie. Bardzo przydatne w niektórych przypadkach.
tail -f foo | grep --line-buffered bar
grep
nie trafiają do terminala (przekierowywany do innego typu pliku). buforowanie linii jest domyślne, gdy dane wyjściowe trafiają do terminala, więc nie robi to żadnej różnicy. Zauważ, że ta opcja jest specyficzna dla GNU.
Możesz po prostu przesłać dane wyjściowe grep
dotail -f
. Istnieją również programy, które łączą tail -f
funkcjonalność z filtrowaniem i kolorowaniem, w szczególności multitail ( przykłady ).
Widzę tych wszystkich ludzi, którzy mówią, aby korzystać tail -f
, ale nie podoba mi się to! Moją ulubioną metodą wyszukiwania pliku przy jednoczesnym obserwowaniu nowych wierszy (np. Zwykle pracuję z plikami dziennika, do których są dołączane przekierowane dane wyjściowe procesów wykonywanych okresowo za pomocą zadań cron):
tail -Fn+0 /path/to/file|grep searchterm
Zakłada to ogon i grep GNU. Dodatkowe informacje ze strony ogona (GNU coreutils, mój to v8.22) [ https://www.gnu.org/software/coreutils/manual/coreutils.html] :
-F same as --follow=name --retry -n, --lines=K output the last K lines, instead of the last 10; or use -n +K to output starting with the Kth. If the first character of K (the number of bytes or lines) is a '+', print beginning with the Kth item from the start of each file, otherwise, print the last K items in the file. K may have a multiplier suffix: b 512, kB 1000, K 1024, MB 1000*1000, M 1024*1024, GB 1000*1000*1000, G 1024*1024*1024, and so on for T, P, E, Z, Y. With --follow (-f), tail defaults to following the file descriptor, which means that even if a tail'ed file is renamed, tail will continue to track its end. This default behavior is not desirable when you really want to track the actual name of the file, not the file descriptor (e.g., log rotation). Use --follow=name in that case. That causes tail to track the named file in a way that accommodates renaming, removal and creation.
Tak więc część tail --follow --retry --lines=+0
końcowa mojego polecenia jest równa temu , w którym ostatni argument kieruje go do rozpoczęcia od początku, pomijając linie zerowe.
tail -f access | awk '/ADD/{print $0}'
Użyj powyższego, zwykle go używam.
Możesz użyć netcata do grepowania wyników tail -f, ponieważ nowe wyniki pojawiają się dość łatwo.
sudo nc -s localhost -l -p 1337 | grep ssh
tail -f /var/log/file.log | nc 127.0.0.1 1337
To ustawia grep na nasłuchiwanie wyników dla danych wejściowych pochodzących z portu 1337.
Drugie polecenie przekazuje dane wyjściowe tail -f do netcat i wysyła je do lokalnego hosta 1337. Aby to zrobić lokalnie, należy przełączyć ttys dla każdego z dwóch zestawów poleceń lub użyj czegoś takiego jak ekran.
To działa. Uważaj jednak, aby dane wyjściowe nie były natychmiastowe: są buforowane przez potok.
tail -f
w jednym oknie, a tail -f logfile | grep pattern
w drugim oknie. Linie zawierające pattern
nie zawsze pojawiają się w obu oknach jednocześnie. Widziałem linie pojawiają się w odstępach 30 sekund w rzadkich przypadkach, co było denerwujące.
tee
czy coś.