2012-03-09 40 views
8

Quiero extraer del comando ping -c 4 www.stackoverflow.com | tail -1| awk '{print $4}' el tiempo promedio.extraer tiempo promedio de ping -c

107.921/108.929/110.394/0.905 ms 

salida debería ser: 108.929

Respuesta

26

Una forma es simplemente añadir un corte a lo que tienes ahí.

ping -c 4 www.stackoverflow.com | tail -1| awk '{print $4}' | cut -d '/' -f 2 
+0

THX, que hizo el truco . Aunque me pregunto sobre una mejor manera con menos tuberías y, finalmente, con un mejor rendimiento. – jack

+6

@jack: después de un mínimo de cuatro segundos para obtener los datos reales, los pequeños gastos generales en esta tubería probablemente nunca importen. –

6

ping -c 4 www.stackoverflow.com | tail -1| awk -F '/' '{print $5}' would fine.

La opción "-F" se usa para especificar el separador de campo.

+0

thx, ¿es posible combinar los dos comandos awk en uno? – jack

+0

Ok. entonces ... estoy actualizando la respuesta ... – raj

+0

Me pregunto, ¿es posible obtener también la pérdida de paquetes si no es cero? –

3

Esto podría funcionar para usted:

ping -c 4 www.stackoverflow.com | sed '$!d;s|.*/\([0-9.]*\)/.*|\1|' 
3

La siguiente solución utiliza Bash única (requiere Bash 3):

[[ $(ping -q -c 4 www.example.com) =~ \ =\ [^/]*/([0-9]+\.[0-9]+).*ms ]] \ 
&& echo ${BASH_REMATCH[1]} 

Para la expresión regular que es más fácil de leer (y manejar) si se almacena en una variable:

regex='= [^/]*/([0-9]+\.[0-9]+).*ms' 
[[ $(ping -q -c 4 www.example.com) =~ $regex ]] && echo ${BASH_REMATCH[1]} 
+0

Es posible que desee cambiar la expresión regular a' = [^ /] */([0-9.] +). * ms 'para incluir valores promedio sin ningún lugares decimales. – gsbabil

0

extracto Directo tiempo medio de comando ping:

ping -w 4 -q www.duckduckgo.com | cut -d "/" -s -f5 

Opciones:

-w time out 4 seconds 
-q quite mode 
-d delimiter 
-s skip line without delimiter 
-f No. of field - depends on your system - sometimes 5th, sometimes 4th 

I personly uso es de esta manera:

if [ $(ping -w 2 -q www.duckduckgo.com | cut -d "/" -s -f4 | cut -d "." -f1) -lt 20 ]; then 
echo "good response time" 
else 
echo "bad response time" 
fi