2012-03-09 12 views
8

Voglio estrarre dal comando ping -c 4 www.stackoverflow.com | tail -1| awk '{print $4}' il tempo medio.tempo medio estratto dal ping -c

107.921/108.929/110.394/0.905 ms 

uscita dovrebbe essere: 108.929

risposta

26

Un modo è quello di aggiungere solo un taglio a ciò che hai lì.

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

thx, che ha fatto il trucco . Anche se mi sto chiedendo un modo migliore con meno tubi e, infine, con prestazioni migliori. – jack

+6

@jack: dopo un minimo di quattro secondi per ottenere i dati effettivi, il piccolo overhead in questa pipeline probabilmente non avrà mai importanza. –

6

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

L'opzione "-F" viene utilizzata per specificare il separatore di campo.

+0

thx, è possibile unire i due comandi awk in uno solo? – jack

+0

Ok. allora .. Sto aggiornando la risposta .. – raj

+0

Mi chiedo, è possibile ottenere anche la perdita di pacchetti se non è zero? –

3

Questo potrebbe funzionare per voi:

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

La seguente soluzione utilizza solo Bash (richiede Bash 3):

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

per l'espressione regolare è più facile da leggere (e gestire) se è memorizzato in una variabile:

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

Si potrebbe voler cambiare l'espressione regolare a '= [^ /] */([0-9.] +). * ms' per includere valori medi senza alcun decimali. – gsbabil

0

estratto diretto tempo medio dal comando ping:

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

Opzioni:

-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 

ho personly uso è in questo modo:

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