Extrai valores do terminal [duplicado]

4

Preciso de ajuda para extrair apenas o valor do tempo ao fazer o ping usando sed.

ping 192.168.1.1
PING 192.168.1.11 (192.168.1.11) 56(84) bytes of data.
64 bytes from 192.168.1.11: icmp_seq=1 ttl=64 time=0.028 ms
64 bytes from 192.168.1.11: icmp_seq=2 ttl=64 time=0.027 ms
64 bytes from 192.168.1.11: icmp_seq=3 ttl=64 time=0.024 ms
64 bytes from 192.168.1.11: icmp_seq=4 ttl=64 time=0.031 ms

Então, depois de usar o sed, gostaria de obter a seguinte saída:

ping 192.168.1.1 | sed '???'
0.028
0.027
0.024
0.031

Obrigado!

    
por Ana.B 24.07.2017 / 11:03

2 respostas

7

Com sed , você pode fazer:

ping 192.168.1.1 | sed -n 's/.*time=\([^ ]*\).*//p'

Isso simplesmente procura o trecho mais longo de não espaço após time= , usa parênteses para capturá-lo para que possamos nos referir a ele como e apenas substitui tudo na linha pelo que foi capturado. O -n (não imprime por padrão) junto com o /p (impressão, se isso funcionou) no final do operador de substituição, garantem que apenas imprimamos linhas relevantes.

Eu não usaria sed para isso, outras ferramentas são mais simples aqui. Por exemplo:

  1. grep

    ping 192.168.1.1 | grep -Po 'time=\K\S+'
    
  2. Perl

    ping 192.168.1.1 | perl -lne '/time=(\S+)/ && print '
    
  3. awk

    ping 192.168.1.1 | awk -F'[= ]' '/time=/{print $(NF-1)}'
    
por terdon 24.07.2017 / 11:10
2

Existem soluções melhores do que sed para este que eu suspeito. A solução a seguir usa o corte e talvez não seja muito elegante, mas funciona bem o suficiente:

ping -c 4 -n google.com | cut -d '=' -s -f4 | cut -d ' ' -f1

Correndo isso na vida real revela:

andrew@illium~$ ping -c 4 -n google.com | cut -d '=' -s -f4 | cut -d ' ' -f1
14.8
16.1
14.9
14.4

andrew@illium~$ 

Adore a linha de comando:)

Notas:

  1. Para o comando ping :

    • -c 4 : Parar após enviar 4 pacotes
    • -n : fornece apenas informações numéricas, não os nomes associados ao endereço do host
  2. Para o primeiro comando cut :

    • -d '=' : use o delimitador do sinal =
    • -f4 : selecione o quarto campo
    • -s : não imprima linhas que não contenham delimitadores
  3. Para o segundo comando cut :

    • -d ' ' : Use o delimitador de um espaço ''
    • f1 : selecione o primeiro campo
por andrew.46 24.07.2017 / 12:01