Usiłuję uzyskać działający system do monitorowania specjalnych dzienników. Zwykle chcę tylko bardzo konkretnego wzoru, z którego wydobywam, grep
i fajki tail -f
. Zauważyłem, że grep nie wyświetla wszystkiego, ale zamiast tego zachowuje bufor niektórych linii. Myślę, że ma to sens, jeśli masz potok, który wyprowadzi wszystko, a następnie zakończy i zamknie strumień.
Ale tail -f
to mi nie wychodzi.
Ten sam problem występuje z sed
.
Oto przykładowe polecenie, którego chcę użyć:
clear && tail -F -n1000 /var/log/fail2ban.log | grep 'WARNING.*Ban' | sed s/'fail2ban.actions: WARNING '//g | grep -E --color 'ssh-iptables-perma|$'
Aby podać przykład:
Ostatni wiersz powyższego polecenia to:
2015-05-04 11:17:24,551 [ssh-iptables] Ban x.x.x.x
I używając tego polecenia:
clear && tail -F -n1000 /var/log/fail2ban.log | grep 'WARNING.*Ban' | sed s/'fail2ban.actions: WARNING '//g
Ostatnia linia to:
2015-05-04 19:45:17,615 [ssh-iptables] Ban y.y.y.y
Usunięcie kolejnych potoków prowadzi mnie do najnowszych wpisów.
Jak mogę uniknąć buforowania w rurach?
sed
.Stosowanie
grep
„s--line-buffered
opcja.Domyślnie narzędzia używają buforowania linii, jeśli ich standardowym wyjściem jest terminal, ale używają większych buforów (prawdopodobnie 4 lub 8 kB), gdy ich wyjście jest podłączone do deskryptora pliku lub potoku.
Masz szczęście, że
tail -F
domyślnie używa buforowania linii igrep
ma opcję wiersza poleceń, aby to włączyć. Nie znam ogólnej metody włączania buforowania linii dla dowolnego polecenia.źródło
stdbuf
narzędzie, które wydaje się bardziej standardowe: stackoverflow.com/questions/3465619/...