You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Shell脚本中捕获ping命令输出的丢包率并赋值给变量

如何在Shell脚本中捕获ping命令输出的丢包率并赋值给变量

嗨,我来给你分享几个简单靠谱的方法,帮你把ping输出里的丢包率抓出来存到变量里,方便后续处理~

方法一:用grep + awk快速提取

这是最直观的方式,先过滤出包含丢包统计的行,再提取对应字段:

# 捕获带百分号的丢包率(比如"0%")
packet_loss=$(ping -c4 8.8.8.8 | grep 'packet loss' | awk -F ', ' '{print $3}')

# 如果只需要数字(比如后续要做数值比较),可以去掉百分号
packet_loss_num=$(ping -c4 8.8.8.8 | grep 'packet loss' | awk -F ', ' '{print $3}' | sed 's/%//')

解释一下:

  • grep 'packet loss':精准定位到包含丢包统计的那一行
  • awk -F ', ' '{print $3}':以, 为分隔符,取第三个字段(也就是0% packet loss里的0%)
  • 后面加sed 's/%//'就是把百分号去掉,得到纯数字,方便后续做数值计算或者比较

方法二:用sed直接正则匹配提取

如果喜欢用正则一步到位,可以试试sed:

packet_loss=$(ping -c4 8.8.8.8 | sed -n 's/.*, \([0-9]*%\) packet loss.*/\1/p')

这里sed的作用拆解:

  • -n:只输出匹配到的内容,避免打印ping的所有输出行
  • 正则.*, \([0-9]*%\) packet loss.*:专门捕获, 和 packet loss之间的百分数字段(比如0%)
  • \1:把捕获到的目标字段作为输出结果,p表示打印这一行

更健壮的写法(处理ping失败的情况)

如果目标不可达,ping会执行失败,这时候可能找不到丢包统计行,所以可以先判断ping是否成功,再提取:

# 把ping输出存到临时文件,避免直接管道处理的问题
ping -c4 8.8.8.8 > /tmp/ping_result 2>&1

if [ $? -eq 0 ]; then
    # ping成功,提取丢包率
    packet_loss=$(grep 'packet loss' /tmp/ping_result | awk -F ', ' '{print $3}')
    echo "当前丢包率:$packet_loss"
else
    # ping失败,默认丢包率100%
    packet_loss="100%"
    echo "ping目标失败,默认丢包率:$packet_loss"
fi

# 记得清理临时文件
rm /tmp/ping_result

这样就算ping失败,变量也会有合理的值,不会为空导致后续脚本逻辑出错。

备注:内容来源于stack exchange,提问作者Simon Kepp Nielsen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 07:40:28