![pipe não grava no arquivo](https://rvso.com/image/83684/pipe%20n%C3%A3o%20grava%20no%20arquivo%20.png)
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 -o0
antes de cada comando e depois descobri quais eram desnecessários.
Responder2
Se você estiver usando GNU, parece que a -l
opção sed está incorreta: você provavelmente deseja a -u
opçã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 -n
a saída correspondente normal, enquanto s///p
força a saída de linhas correspondentes.