如何在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
相关产品推荐
相关产品推荐

