从ping -c中提取平均时间

22

我想从命令 ping -c 4 www.stackoverflow.com | tail -1| awk '{print $4}' 中提取平均时间。

107.921/108.929/110.394/0.905 ms

期望输出为:108.929

8个回答

51

一种方法是在你已有的内容中添加一个断点。

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

谢谢,那解决了问题。虽然我在想是否有更好的方法,少用一些管道并提高性能。 - creativeDev
7
@jack:在获取实际数据的最短时间为四秒后,这条流水线中的小开销可能永远不会产生影响。 - Eduardo Ivanec

13

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

"-F"选项用于指定字段分隔符。


我想知道,如果非零的话,是否也可能出现数据包丢失? - Eric Wolf
5
您可以去除“tail”命令: ping -c 4 www.stackoverflow.com | awk -F '/' 'END {print $5}' - luissquall

5
这可能适用于您:

这对您可能有用:

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

4
以下解决方案仅使用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]}

1
你可能想将正则表达式更改为'= [^/]*/([0-9.]+).*ms',以包括没有小数位的平均值。 - gsbabil

4

3
直接从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

0

使用以下命令获取当前ping值作为单个数字:

123.456: ping -w1 -c1 8.8.8.8 | tail -1| cut -d '=' -f 2 | cut -d '/' -f 2

123: ping -w1 -c1 8.8.8.8 | tail -1| cut -d '=' -f 2 | cut -d '/' -f 2 | cut -d '.' -f 1

请注意,此命令仅显示1个ping的平均值(-c1),您可以通过增加此数字(如-c1337)来增加样本大小。

这避免了使用awk(像@Buggabill发布的那样),在bash别名中不起作用且需要多花一纳秒钟。


最好使用函数而不是别名,这样你根本不需要将代码转换为可预先添加的字符串,可以在代码中任何位置注入参数,并且可以在脚本内重用这些函数(其中别名默认禁用)。 - Charles Duffy

-1

对我来说,这些都不太好用,因为会出现各种问题,比如超时。我只想看到坏的ping时间或超时,并希望PING快速继续,但这些解决方案都不起作用。以下是我的BASH脚本,可以很好地完成这两个任务。请注意,在ping命令中,响应时间限制为1秒。

我意识到这并没有直接回答OP的问题,但它确实提供了一种处理某些问题的好方法,这些问题在这里提供的一些不完整的“解决方案”中会出现,因此超出了OP问题的范围,其他人来到这里寻找(我自己就是一个例子),所以我决定分享给那些人,而不是特别针对OP的问题。

while true
do
###Set your IP amd max milliseconds###
  ip="192.168.1.53"
  maxms=50
###do not edit below###
  err="100% packet loss"
  out="$(ping -c 1 -i 1 -w 1 $ip)"
  t="$(echo $out | awk -F '/' 'END {print $5}')"
  t=${t%.*}
  re='^[0-9]+$'

  if ! [[ $t =~ $re ]] ; then
    if [[ $out == *"$err"* ]] ; then
      echo "`date` | ${ip}: TIMEOUT"
    else 
      echo "error: Not a number: ${t} was found in: ${out}"
    fi
  else
    if [ "$t" -gt $maxms ]; then
      echo "`date` | ${ip}: ${t} ms"
    fi
  fi
done

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接