2012-03-09 141 views
8

我想從命令中提取ping -c 4 www.stackoverflow.com | tail -1| awk '{print $4}' 的平均時間。從ping中提取平均時間-c

107.921/108.929/110.394/0.905 ms 

輸出應該是:108.929

回答

26

一種方法是隻需添加一個切到你那裏。

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

THX,該訣竅。雖然我想知道更少的管道,並最終獲得更好的性能更好的方式。 – jack 2012-03-09 13:48:30

+6

@jack:在獲取實際數據的最少四秒鐘之後,此管道中的小開銷可能不會有問題。 – 2012-03-09 14:41:04

6

ping -c 4 www.stackoverflow.com | tail -1| awk -F '/' '{print $5}'會正常工作。

「-F」選項用於指定字段分隔符。

+0

thx,是否有可能將兩個awk命令合併爲一個? – jack 2012-03-09 13:50:54

+0

好的。然後..我正在更新答案.. – raj 2012-03-09 13:56:31

+0

我想知道,如果它是非零也有可能丟包? – 2014-08-12 03:49:48

3

這可能會爲你工作:

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

以下解決方案只使用巴什(需要猛砸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]} 
+0

您可能希望將正則表達式更改爲'= [^ /] * /([0-9。] +)。* ms'以包含平均值小數位。 – gsbabil 2012-03-16 12:32:19

0

直接提取意味着從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 

我personly的使用是這樣:

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