Myslím, že váš problém je v tom, že grep používá nějaké výstupní vyrovnávací paměti. Zkuste
tail -f file | stdbuf -o0 grep my_pattern
nastaví výstupní režim vyrovnávací paměti grep na unbuffered.
Zapněte grep
režim vyrovnávací paměti řádku při použití BSD grep (FreeBSD, Mac OS X atd.)
tail -f file | grep --line-buffered my_pattern
Vypadá to jako před chvílí --line-buffered
nezáleželo na GNU grep (používá se v podstatě na jakémkoli Linuxu), protože se ve výchozím nastavení vyprázdnil (YMMV pro jiné unixové systémy jako SmartOS, AIX nebo QNX). Od listopadu 2020 však --line-buffered
je potřeba (alespoň s GNU grep 3.5 v openSUSE, ale na základě komentářů níže se zdá být obecně potřeba).
Používám tail -f <file> | grep <pattern>
pořád.
Počká, až se grep vypláchne, ne až skončí (používám Ubuntu).
Pokud chcete najít shodu v celém soubor (nejen ocas) a chcete, aby seděl a čekal na nové shody, funguje to pěkně:
tail -c +0 -f <file> | grep --line-buffered <pattern>
-c +0
příznak říká, že výstup by měl začínat 0
bajtů (-c
) od začátku (+
) souboru.