pipe não grava no arquivo

pipe não grava no arquivo

Quero obter apenas o número de ms de um comando ping para um arquivo. Sem canalizar para um arquivo, ele funciona conforme o esperado. Estou um pouco perdido sobre o porquê de um arquivo não gravar nada.

Isso funciona:

ping 192.168.1.1 |egrep --line-buffered -v 'PING|timeout' |sed -l -e 's/^.* time=\(.*\) ms$/\1/g'

Isso não escreve nada no ping.dat

ping 192.168.1.1 |egrep --line-buffered -v 'PING|timeout' |sed -l -e 's/^.* time=\(.*\) ms$/\1/g' > ping.dat

O que estou fazendo de errado?

Responder1

Cada um |é potencialmente cercado por um buffer de saída stdio e um buffer de entrada stdin. Você precisa descobrir quais deles você precisa desligar para obter 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$/\1/g' > file

Inicialmente coloquei stdbuf -i0 -o0antes de cada comando e depois descobri quais eram desnecessários.

Responder2

Se você estiver usando GNU, parece que a -lopção sed está incorreta: você provavelmente deseja a -uopção (sem buffer). Além disso, o grepé supérfluo. Você deve conseguir o que deseja apenas com o sed:

ping $HOST | sed -u -n '/ ms$/s/.* time=\(.*\) ms$/\1/p' >file.out

Suprime -na saída correspondente normal, enquanto s///pforça a saída de linhas correspondentes.

informação relacionada