Tentando capturar apenas o tempo de retorno dos pacotes da ping
saída, emiti
$ ping 192.168.0.1 | grep -o '[^ =]* ms'
e funcionou, exibindo a hora de cada pacote quando chegou. Como eu também queria me livrar da unidade de tempo, achei que isso seria suficiente:
$ ping 192.168.0.1 | grep -o '[^ =]* ms' | grep -o '^[^ ]*'
Mas, para minha surpresa, ele trava, não mostrando saída. Substituir o primeiro comando por uma echo
linha de amostra da ping
saída, no entanto, funciona conforme o esperado (ele produz 5.07
):
$ echo '64 bytes from 192.168.0.1: icmp_seq=10 ttl=64 time=5.07 ms' | grep -o '[^ =]* ms' | grep -o '^[^ ]*'
Encontrei outros meios de obter apenas o tempo sem a unidade de milissegundos, mas ainda assim: Qual é o problema com o ping
comando? Por que passar por um tubo é bom, mas não por dois?
PS: Estes abaixo também falham, enquanto suas echo
versões são bem-sucedidas, portanto, o problema não pode ser comgrep
$ ping 192.168.0.1 | grep -o '[^ =]* ms' | sed 's_ ms__'
$ ping 192.168.0.1 | grep -o '[^ =]* ms' | cut -f 1 -d ' '
$ ping 192.168.0.1 | cut -f 7 -d ' ' | cut -f 2 -d '='
A resposta definitiva é buffer de linha . Você pode demonstrar isso em
ping -c 3
vez de apenasping
, onde toda a saída é produzida apenas na conclusão do primeiro comando.Como solução alternativa com o GNU
grep
, você pode reduzir seus dois filtros a umOu se você realmente quiser usar dois filtros,
grep --line-buffered ...
oustdbuf -oL grep ...
funcionará para você.Eu acho que seu problema é causado pelo buffer de linha do seu shell.
Se você permitir que seu comando seja executado por tempo suficiente, deverá ver alguma saída.
Ou apenas limite a quantidade de pings assim:
Há mais algumas informações e soluções alternativas (soluções?) se você seguir este link