Não consigo descobrir como escrever um log de ping simples. Eu só preciso do valor ms ou das palavras "sem conexão".
Eu tenho myping=$(ping -c 1 10.0.10.1)
. Preciso apenas do valor entre " time=
" e " ms
", como 3.151 de " time=3.151 ms
".
Eu poderia usar o awk, mas recebo muitas linhas em branco e não sei como me livrar delas:
$ awk -F 'time=| ms' '{print $2}' <<< "$myping"
3.151
E então, como posso inserir "sem conexão", quando o resultado do ping não contém um valor ms?
Muito obrigado!
Supondo que você esteja no Linux e sua saída de ping seja semelhante a esta:
Você pode fazer com que
=
sinais e espaços dividam os campos e depois escolher o campo correto. E verifique no final se você conseguiu algum valor.Na linha de um ping individual, esse seria o campo 10.
Alternativamente, você pode ler os números resumidos da última linha, por exemplo, escolher o rtt mínimo.
Com
/
espaço ou como separadores de campo, o rtt mínimo é o campo 7 na última linha.(O
ping
no meu Mac tem uma saída ligeiramente diferente, a principal diferença aqui éround-trip
em vezrtt
da última linha. Se o seu for diferente, você terá que ajustar os padrões e os números dos campos de acordo.)Mas em vez de usar uma string especial na saída para marcar um controle remoto que não está respondendo, pode ser melhor definir o status de saída do comando. (O que
ping
provavelmente também acontece.)Então, adicione um
exit 1
em um local apropriado no script e você poderá fazer algo assim:Se estiver usando
ping
fromiputils
/ Linux, queping -c1 localhost
gera algo assim:A segunda linha conterá
ms
no final apenas se o destino estiver acessível.Então, provavelmente não é a solução mais elegante, mas usando
sed
:-E
: ativar o suporte ERE-n
: e não imprima automaticamente o espaço do padrão;2{[...]}
: se estivermos processando a linha #2s/.*=([0-9.]+) ms$/\1/p
e a linha corresponder a esse padrão, substitua a linha inteira pelo primeiro grupo capturado e imprima a linha;t
: se foi realizada uma substituição, iniciar o novo ciclo,s/.*/no connection/p}
: caso contrário, substitua a linha inteira porno connection
.Uma pequena variante da resposta (correta) de @terdon: permite que você faça mais de 1 ping para calcular a média e talvez forneça um resultado mais preciso:
ou ainda mais simples: usando a última linha com estatísticas (min/avg/max/mdev) :
No meu sistema Arch,
ping
os resultados para um host que pode e para um host que não pode ser alcançado são assim:e
Supondo que sua saída seja idêntica e que a saída da conexão com falha seja salva em
$badPing
um in$goodPing
, você pode fazer:O comando acima usa
=
como separador de campo. Então, em cada linha que contém a stringtime=
, ele substitui a primeira ocorrência da stringms
naquela linha (observe que isso pressupõe apenas uma ocorrência dems
na linha relevante; se esse não for o seu caso, usesub(/ms/,"",$NF)
em vez disso) o que deixa nos com apenas o valor numérico como último campo, e salva o número de substituições feitask
e o último campo comol
.Então, depois de processarmos toda a entrada, if
k
está definido, então se ocorreu uma substituição, imprimimos o valor del
e se não, imprimimosno connection
.Alternativamente, você pode definir o valor de
l
no início e depois imprimi-lo:Para fazer sua abordagem original funcionar, basta adicionar um segundo campo como condicional e definir uma variável com base nele. Então você pode imprimir o segundo campo quando ele existir e imprimir
no connection
no final se a variável não estiver definida. Assim: