我想从命令 ping -c 4 www.stackoverflow.com | tail -1| awk '{print $4}'
中提取平均时间。
107.921/108.929/110.394/0.905 ms
期望输出为:108.929
一种方法是在你已有的内容中添加一个断点。
ping -c 4 www.stackoverflow.com | tail -1| awk '{print $4}' | cut -d '/' -f 2
ping -c 4 www.stackoverflow.com | tail -1| awk -F '/' '{print $5}'
命令可以正常工作。
"-F"选项用于指定字段分隔符。
ping -c 4 www.stackoverflow.com | awk -F '/' 'END {print $5}'
。 - luissquall这对您可能有用:
ping -c 4 www.stackoverflow.com | sed '$!d;s|.*/\([0-9.]*\)/.*|\1|'
[[ $(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]}
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
使用以下命令获取当前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别名中不起作用且需要多花一纳秒钟。
对我来说,这些都不太好用,因为会出现各种问题,比如超时。我只想看到坏的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