![Shell 脚本从命令输出中捕获值](https://linux22.com/image/791188/Shell%20%E8%84%9A%E6%9C%AC%E4%BB%8E%E5%91%BD%E4%BB%A4%E8%BE%93%E5%87%BA%E4%B8%AD%E6%8D%95%E8%8E%B7%E5%80%BC.png)
从 shell 脚本中,我运行 ping 命令:
ping -c4 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=58 time=34.2 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=58 time=30.9 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=58 time=29.6 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=58 time=29.3 ms
--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3006ms
rtt min/avg/max/mdev = 29.311/31.022/34.242/1.951 ms
我需要将数据包丢失(上例中的 0%)捕获到 shell 脚本中的一个变量中,以便进一步处理。有人能告诉我如何做到这一点吗?
答案1
您可以使用 grep 和 awk 从 ping 命令的输出中捕获数据包丢失。以下是示例:
ping_result=$(ping -c4 8.8.8.8)
packet_loss=$(echo "$ping_result" | grep -oP '\d+% packet loss')
echo "Packet Loss: $packet_loss"
在此示例中,您将结果存储在名为 ping_result 的变量中,以供进一步处理。
在 packet_loss 行中,您使用带有 Perl 参数的 grep 来提取所需的信息(%数据包丢失)。
最后,在最后一行输出变量。
希望能帮助到你!
答案2
类似的东西awk
可以完成工作:
packet_lost=$(ping -c4 8.8.8.8|awk '/packet loss/ {print $6}')
答案3
如果你仅有的想知道全部数据包丢失(即主机不可访问),某些版本的ping
返回退出代码 1在这种情况下: