Cada |
é potencialmente cercado por um buffer de saída stdio e um buffer de entrada stdin. Você precisa descobrir quais deles você precisa desativar para obter a tubulação em tempo real.
Isso funciona para mim:
ping localhost |egrep --line-buffered -v 'PING|timeout' |\
stdbuf -o0 sed -l -e 's/^.* time=\(.*\) ms$//g' > file
Inicialmente, coloquei stdbuf -i0 -o0
antes de cada comando e depois descobri quais eram desnecessários.