извлечение среднего времени из ping-c

Я хочу извлечь из команды ping -c 4 www.stackoverflow.com | tail -1| awk '{print }' среднее время.

107.921/108.929/110.394/0.905 ms

вывод должен быть: 108.929

6 ответов


один из способов-просто добавить о том, что у вас есть.

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

ping -c 4 www.stackoverflow.com | tail -1| awk -F '/' '{print }' будет работать нормально.

опция"-F" используется для указания разделителя полей.


Это может сработать для вас:

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

следующее решение использует только Bash (требуется Bash 3):

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

для регулярного выражения легче читать (и обрабатывать), если оно хранится в переменной:

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

поощрения очень элегантный комментарий luissquall ответ:

 ping -c 4 www.stackoverflow.com | awk -F '/' 'END {print }'

прямое извлечение среднего времени из команды ping:

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

варианты:

-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

Я лично использую этот способ:

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