在Bash/Shell脚本中使用Regex搜索特定字符串



我正试图为谷歌这样的网站回显4个ICMP回显/回显依赖数据包的平均往返时间(以毫秒为单位(。这是我目前的代码。

echo "$(ping -c 4 google.com | grep '??????')"

ping网站是可行的,但我不知道如何只反映平均往返时间。我只在web表单上使用过Regex进行验证,但我已经有一段时间没有使用它了。我想我可以使用Regex只找到我正在搜索的内容,但如果有更好的方法,那也太好了。我正在使用linux ubuntu 的shell脚本编写这篇文章

这是输出的一个示例。我只需要底部写着rtt min/avg/max/mdev = 14.556/14.579/14.614/0.088 ms的部分。

PING google.com (142.250.74.238) 56(84) bytes of data.
64 bytes from par10s40-in-f14.1e100.net (142.250.74.238): icmp_seq=1 ttl=108 tim                                                                                                                                                                             e=14.5 ms
64 bytes from par10s40-in-f14.1e100.net (142.250.74.238): icmp_seq=2 ttl=108 tim                                                                                                                                                                             e=14.5 ms
64 bytes from par10s40-in-f14.1e100.net (142.250.74.238): icmp_seq=3 ttl=108 time=14.5 ms
64 bytes from par10s40-in-f14.1e100.net (142.250.74.238): icmp_seq=4 ttl=108 time=14.6 ms
--- google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3003ms
rtt min/avg/max/mdev = 14.556/14.579/14.614/0.088 ms

假设ping输出如下所示:

$ ping -c 4 google.com
PING google.com (172.217.14.238): 56 data bytes
64 bytes from 172.217.14.238: icmp_seq=0 ttl=118 time=78.019 ms
64 bytes from 172.217.14.238: icmp_seq=1 ttl=118 time=62.416 ms
64 bytes from 172.217.14.238: icmp_seq=2 ttl=118 time=63.019 ms
64 bytes from 172.217.14.238: icmp_seq=3 ttl=118 time=62.415 ms
--- google.com ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max/stddev = 62.415/66.467/78.019/6.674 ms

在这种情况下,平均时间为66.467(ms(

一个awk解决方案:

awk '/avg/ {split($0,arr,"/"); print arr[5]}'

其中:

  • /avg/-查找具有字符串avg的行
  • split($0,arr,"/")-使用正斜杠(/(作为分隔符拆分行,将段放在arr[]数组中
  • print arr[5]-打印arr[]阵列的第5个元素

ping:的结合

ping -c 4 google.com | awk '/avg/ {split($0,arr,"/"); print arr[5]}'
66.467

如果我们需要包括时间测量(在这种情况下为ms(,我们还可以打印包含字符串avg的行的最后一个字段,例如:

ping -c 4 google.com | awk '/avg/ {split($0,arr,"/"); print arr[5],$NF}'
66.467 ms

注意

如果他们的ping输出格式不同,则OP可能需要调整awk命令
  • 显然(?(每次运行ping时,我们可能会得到一个稍微不同的值
  • 如果OP希望100%确定该值,则应将ping命令输出保存到文件(或变量(中,然后针对所述文件(或变数(运行awk命令
  • 相关内容

    • 没有找到相关文章

    最新更新