Outra variação de awk
:
ping -qc1 google.com 2>&1 | awk -F'/' 'END{ print (/^rtt/? "OK "$5" ms":"FAIL") }'
-
-F'/'
- tratar a barra/
como separador de campos
Exemplo de saída:
OK 47.090 ms
É possível mostrar apenas a quantidade de milissegundos durante o ping, em vez de toda a página de resultados?
Quero verificar se meus servidores estão on-line, portanto, quero retornar "OK xyz ms" ou "FAIL". Eu estou fazendo isso da seguinte maneira:
#!/bin/sh
ergebnis=$(ping -qc1 google.com)
ok=$?
avg=$(echo -e "$ergebnis" | tail -n1 | awk '{print $4}' | cut -f 2 -d "/")
if [ $ok -eq 0 ]
then
echo "OK $avg ms"
else
echo "FAIL"
fi
No entanto, isso usa alguns canais e como eu estou executando esse comando com bastante frequência para monitorar meus servidores, estou querendo saber se existe uma abordagem "mais inteligente". Também tenho medo de que meus pipes não funcionem corretamente quando o comando ping falhar.
Não há muito o que fazer com ping
, mas você pode fazer todo o processamento no AWK, reduzindo o número de canais, processos, etc.:
ping -qc1 google.com 2>&1 | awk -F/ '/^rtt/ { printf "OK %.2f ms\n", $5; ok = 1 } END { if (!ok) print "FAIL" }'
Se você não está muito preocupado com a mensagem de erro exata, então que tal
ping google.com | grep -Po "time.*"