
Como posso diminuir o tempo de um retorno de ping? Por exemplo:
64 bytes from 10.3.0.1: icmp_seq=0 ttl=63 time=2.610 ms
Quero pegar o valor depois time=
e passá-lo para um teste como:
if time>=50.0; then do_something; fi
Responder1
Então, se você quiser obter apenas o time
valor sem o ms
rótulo:
HOST="127.0.0.1"
PING_MS=`ping -c1 "$HOST" | /usr/bin/awk 'BEGIN { FS="=" } /time=/{gsub(/ ms/, ""); print $NF; exit}'`
Isso me dá:
0.058
Agora, se quiséssemos testar if time>=50.0
, poderíamos usar awk
para isso também, já que sh
o próprio POSIX não pode comparar números decimais:
if echo $PING_MS | awk '{exit $1>=50.0?0:1}'; then
echo "Ping time is >= 50.0ms."
fi
Você poderia encurtar isso para:
if ping -c1 "$HOST" | /usr/bin/awk 'BEGIN { FS="=" } /time=/{gsub(/ ms/, ""); exit $NF>=50.0?0:1}'; then
echo "Ping time is >= 50.0ms."
fi
FS
é o Separador de Campos e $NF
é sempre o último campo. $NF>=50.0?0:1
sairá com um código de saída de sucesso se o último campo for >=50.0
; ou um código de saída de erro, caso contrário. /time=/
corresponde apenas às linhas que contêm time=
. gsub(/ ms/, "");
remove " ms"
da string.