比较 FreeBSD sh 中的 ping 时间

比较 FreeBSD sh 中的 ping 时间

如何从 ping 返回中去除时间?例如:

64 bytes from 10.3.0.1: icmp_seq=0 ttl=63 time=2.610 ms

我想获取之后的值time=并将其传递给如下测试:

if time>=50.0; then do_something; fi

答案1

因此,如果您只想获取time不带ms标签的值:

HOST="127.0.0.1"
PING_MS=`ping -c1 "$HOST" | /usr/bin/awk 'BEGIN { FS="=" } /time=/{gsub(/ ms/, ""); print $NF; exit}'`

这给了我:

0.058

现在,如果我们想测试 if time>=50.0,我们awk也可以使用它,因为 POSIXsh本身无法比较十进制数:

if echo $PING_MS | awk '{exit $1>=50.0?0:1}'; then
    echo "Ping time is >= 50.0ms."
fi

您可以将其缩短为:

if ping -c1 "$HOST" | /usr/bin/awk 'BEGIN { FS="=" } /time=/{gsub(/ ms/, ""); exit $NF>=50.0?0:1}'; then
    echo "Ping time is >= 50.0ms."
fi

FS是字段分隔符,并且$NF始终是最后一个字段。如果最后一个字段是;$NF>=50.0?0:1将退出并显示成功退出代码>=50.0如果没有,则返回错误退出代码。/time=/仅匹配包含time=.从字符串中gsub(/ ms/, "");删除。" ms"

相关内容