我想从命令ping -c 4 www.stackoverflow.com | tail -1| awk '{print $4}'
中提取平均时间。
107.921/108.929/110.394/0.905 ms
输出应为:108.929
答案 0 :(得分:32)
一种方法是只为你拥有的东西添加一个剪切。
ping -c 4 www.stackoverflow.com | tail -1| awk '{print $4}' | cut -d '/' -f 2
答案 1 :(得分:7)
ping -c 4 www.stackoverflow.com | tail -1| awk -F '/' '{print $5}'
可以正常使用。
“ - F”选项用于指定字段分隔符。
答案 2 :(得分:4)
这可能对您有用:
ping -c 4 www.stackoverflow.com | sed '$!d;s|.*/\([0-9.]*\)/.*|\1|'
答案 3 :(得分:3)
以下解决方案仅使用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]}
答案 4 :(得分:2)
Promoting luissquall's very elegent comment to an answer:
ping -c 4 www.stackoverflow.com | awk -F '/' 'END {print $5}'
答案 5 :(得分: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
我个人使用就是这样:
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
答案 6 :(得分: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别名中表现不佳+花费了十亿分之一秒的时间
答案 7 :(得分:-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