Saída de ping - tempo de época para legível por humanos

0

Eu gostaria que o tempo de saída do ping fosse legível, atualmente eu recebo:

pingn -DO 10.0.0.1
PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
[1452885114.787974] no answer yet for icmp_seq=1
[1452885115.795961] no answer yet for icmp_seq=2
[1452885116.803959] no answer yet for icmp_seq=3

Eu pesquisei por aí, tentando coisas como:

pingn -DO 10.0.0.1 | sed 's/(.*)(1[0-9]{9}.[0-9]6)(.*)/echo  $(date -d @ +"%d-%m-%Y %T %z") /e'

mas eu só recebo erros do sed.

Obrigado,

    
por Tim 15.01.2016 / 20:40

3 respostas

0

Dois erros:

  • [0-9]6 deve ser [0-9]{6} , o que significa corresponder a 6 0-9 caracteres - as frações de segundo.

  • Você está usando expressões regulares estendidas, portanto, é necessário usar o sinalizador -r com sed para evitar erros como:

    sed: -e expression #1, char 74: invalid reference  on 's' command's RHS
    

Os comandos corrigidos são:

pingn -DO 10.0.0.1 | sed -r 's/(.*)(1[0-9]{9}.[0-9]{6})(.*)/echo  $(date -d @ +"%d-%m-%Y %T %z") /e'

E a saída será neste formato:

PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
[ 16-01-2016 12:02:59 +0000 ] 64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=2.28 ms
[ 16-01-2016 12:03:00 +0000 ] 64 bytes from 10.0.0.1: icmp_seq=2 ttl=64 time=0.678 ms
...

Note que pingn não é o comando normal para o ping. Tem certeza de que não está querendo dizer ping ?

    
por Martin Thornton 16.01.2016 / 13:29
1

Você pode usar algo assim, transformando a data com perl:

 ping -DO 8.8.8.8 |  perl -pe 's/(\d{10}.\d{6})/localtime($1)/e' 

Semelhante à expressão sed, isso usa o formato '/ / /'. O $ 1 é equivalente ao sed \ 1. localtime converte os números correspondidos dentro dos parênteses escapados: \d{10}.\d{6} é o tempo de época (10 dígitos) com microssegundos (6 dígitos) com sufixo, conforme definido pela opção ping -D .

PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
[Sun Jan 17 22:47:40 2016] 64 bytes from 8.8.8.8: icmp_seq=1 ttl=51 time=15.4 ms
[Sun Jan 17 22:47:41 2016] 64 bytes from 8.8.8.8: icmp_seq=2 ttl=51 time=14.3 ms
[Sun Jan 17 22:47:42 2016] 64 bytes from 8.8.8.8: icmp_seq=3 ttl=51 time=20.0 ms
[Sun Jan 17 22:47:43 2016] 64 bytes from 8.8.8.8: icmp_seq=4 ttl=51 time=15.1 ms
[Sun Jan 17 22:47:44 2016] 64 bytes from 8.8.8.8: icmp_seq=5 ttl=51 time=12.8 ms
    
por belacqua 15.01.2016 / 20:59
0

Aqui está uma solução bruta, mas funcional, com AWK .

ping -c 4 -DO 8.8.8.8 | awk '/^\[/ {gsub(/\[/,"");gsub(/\]/,""); CMD="echo "$1"|date"; system(CMD); for(i=2;i<=NF;i++) printf(" %s ",$i); printf("\n") } /---/,/rtt min/{print}'

Exemplo de saída:

    $ ping -c 4 -DO 8.8.8.8 | awk '/^\[/ {gsub(/\[/,"");gsub(/\]/,""); CMD="echo "$1"|date"; system(CMD); for(i=2;i<=>
Sun Jan 17 23:24:35 MST 2016
 64  bytes  from  8.8.8.8:  icmp_seq=1  ttl=55  time=44.1  ms 
Sun Jan 17 23:24:36 MST 2016
 64  bytes  from  8.8.8.8:  icmp_seq=2  ttl=55  time=41.6  ms 
Sun Jan 17 23:24:37 MST 2016
 64  bytes  from  8.8.8.8:  icmp_seq=3  ttl=55  time=41.4  ms 
Sun Jan 17 23:24:38 MST 2016
 64  bytes  from  8.8.8.8:  icmp_seq=4  ttl=55  time=49.9  ms 
--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 41.470/44.294/49.976/3.455 ms
    
por Sergiy Kolodyazhnyy 18.01.2016 / 07:20