Usando 'ping', 'cut' e 'tee' juntos

6

Então, eu entendo que usando 'tee' eu posso redirecionar a saída de um comando como 'ping' para stdout assim como um arquivo.

Por exemplo:

> ping google.com | tee somefile

Isso mostraria as estatísticas de ping no terminal e as gravaria em 'somefile'.

Agora, se eu quiser modificar a saída de 'ping', posso usar 'cut' de tal maneira:

> ping google.com | cut -d' ' -f 1

Mas, se eu quiser usar todos os três comandos juntos, recebo uma saída no stdout e um arquivo vazio.

> ping google.com | cut -d' ' -f 1 | tee somefile

O que estou fazendo de errado? Existe uma maneira melhor de fazer isso? De alguma forma eu sinto que não estou usando 'tee' corretamente. Qualquer insight seria apreciado.

Estou usando o bash shell, se isso for relevante.

    
por Aniruddha Deshpande 01.02.2016 / 20:14

1 resposta

12

Seus comandos pipe, como destino não terminal, estão armazenando em buffer sua saída. Ele aparecerá eventualmente, mas somente quando uma grande quantidade de saídas for criada ou o comando ping sair.

Você pode usar ping -c 5 google.com para definir um número específico de pacotes a serem enviados e, em seguida, o ping sairá. Sua saída volta e os pipes devem funcionar como esperado.

Editar: outra solução alternativa usa stdbuf para evitar o buffer de tubulação e awk para evitar algum buffer cut interno e permite que o ping seja executado continuamente:

ping www.google.com | stdbuf --output=0 awk '{print $1}' | tee /tmp/file
    
por 01.02.2016 / 20:24

Tags