pipe não grava no arquivo [duplicado]

1

Eu quero obter apenas o número de ms de um comando ping para um arquivo Sem canalizar para um arquivo, ele funciona como pretendido. Estou um pouco perdido no porquê > para um arquivo não escreve nada.

Isso funciona:

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

Isso não escreve nada para ping.dat

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

O que estou fazendo de errado?

    
por John 16.02.2016 / 14:17

2 respostas

2

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.

    
por 16.02.2016 / 14:31
0

Se você estiver usando o GNU, então parece que a opção -l para sed está incorreta: você provavelmente quer a opção -u (unbuffered). Além disso, o grep é supérfluo. Você deve conseguir o que deseja apenas do sed:

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

O -n suprime a saída de correspondência normal, enquanto o s///p força a saída de linhas correspondentes.

    
por 16.02.2016 / 15:02

Tags