grep i sed z fajką od ogona -f wydają się buforować

2

Usiłuję uzyskać działający system do monitorowania specjalnych dzienników. Zwykle chcę tylko bardzo konkretnego wzoru, z którego wydobywam, grepi 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 -fto 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?

BrainStone
źródło

Odpowiedzi:

6

Dodaj grepopcję --line-bufferedi sedopcję --unbuffered.

Cyrus
źródło
egmont lepiej to wytłumaczy, ale dałeś mi też właściwą opcję sed.
BrainStone
Wskazówka ze strony man grep: Może to spowodować
Cyrus
Tak myślałem. Ale tak naprawdę nie wpłynie to na nas, ponieważ jest kilka linii na minutę, z którymi dobry serwer powinien sobie poradzić. Ale i tak dziękuję za ostrzeżenie ..
BrainStone
2

Stosowanie grep„s --line-bufferedopcja.

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 -Fdomyślnie używa buforowania linii i grepma opcję wiersza poleceń, aby to włączyć. Nie znam ogólnej metody włączania buforowania linii dla dowolnego polecenia.

egmont
źródło
1
W przypadku dowolnych poleceń możesz użyć narzędzia unbuffer .
John1024
Dzięki; w międzyczasie znalazłem stdbufnarzędzie, które wydaje się bardziej standardowe: stackoverflow.com/questions/3465619/...
egmont