Penso che il tuo problema sia che grep utilizza un buffer di output. Prova
tail -f file | stdbuf -o0 grep my_pattern
imposterà la modalità di buffering dell'output di grep su unbuffered.
Attiva grep
la modalità di line buffering di quando si utilizza BSD grep (FreeBSD, Mac OS X ecc.)
tail -f file | grep --line-buffered my_pattern
Sembra un po' di tempo fa --line-buffered
non importava per GNU grep (usato praticamente su qualsiasi Linux) poiché veniva scaricato per impostazione predefinita (YMMV per altri tipi di Unix come SmartOS, AIX o QNX). Tuttavia, a partire da novembre 2020, --line-buffered
è necessario (almeno con GNU grep 3.5 in openSUSE, ma sembra generalmente necessario in base ai commenti di seguito).
Uso il tail -f <file> | grep <pattern>
tutto il tempo.
Aspetterà finché grep non si scarica, non finché non finisce (sto usando Ubuntu).
Se vuoi trovare corrispondenze nell'intero file (non solo la coda), e vuoi che si sieda e attenda eventuali nuove corrispondenze, funziona bene:
tail -c +0 -f <file> | grep --line-buffered <pattern>
Il -c +0
flag dice che l'output dovrebbe iniziare con 0
byte (-c
) dall'inizio (+
) del file.