我不知道如何编写简单的 ping 日志。我只需要 ms 值或“无连接”字样。
我有。我只需要“ ”和“ ”myping=$(ping -c 1 10.0.10.1)
之间的值,例如“ ”中的3.151。time=
ms
time=3.151 ms
我可以使用 awk,但是我会得到很多空行,而且我不知道如何摆脱它们:
$ awk -F 'time=| ms' '{print $2}' <<< "$myping"
3.151
然后,当 ping 结果不包含 ms 值时,我该如何插入“无连接”?
多谢!
假设您使用的是 Linux,并且您的 ping 输出如下所示:
您可以用
=
符号和空格分隔字段,然后选择正确的字段。最后检查是否获得了值。在单个 ping 线路上,这将是第 10 个字段。
或者,您可以读取最后一行的摘要数字,例如选择最小 rtt。
使用
/
或空格作为字段分隔符,最小 rtt 是最后一行的第 7 个字段。(
ping
我的 Mac 上的输出略有不同,主要区别在于最后一行是round-trip
。rtt
如果您的不同,则必须相应地调整模式和字段编号。)但是,与其在输出中使用特殊字符串来标记远程未应答,不如使用命令的退出状态。(这很
ping
可能也是它本身的作用。)因此,
exit 1
在脚本中的适当位置添加一个,然后您可以执行以下操作:如果使用
ping
fromiputils
/Linux,其ping -c1 localhost
输出如下内容:ms
只有当目的地可以到达时,第二行才会在末尾包含。因此,可能不是最优雅的解决方案,但使用
sed
:-E
:开启 ERE 支持-n
:并且不自动打印模式空间;2{[...]}
:如果我们正在处理第 2 行s/.*=([0-9.]+) ms$/\1/p
并且该行与该模式匹配,用第一个捕获的组替换整行并打印该行;t
:如果进行了替换,则开始新循环,s/.*/no connection/p}
:否则用 替换整行no connection
。@terdon 的(正确)答案有一点变体:允许您进行超过 1 次 ping 来取平均值并得出更准确的结果:
或者更简单:使用最后一行统计数据(min/avg/max/mdev):
在我的 Arch 系统上,
ping
可以访问的主机和无法访问的主机的结果如下所示:和
假设您的输出相同,并且假设失败的连接的输出保存在
$badPing
成功的输出中$goodPing
,您可以执行以下操作:上述命令使用
=
作为字段分隔符。然后,在包含字符串 的每一行上time=
,它会替换该行上第一次出现的字符串ms
(请注意,这假设相关行上只出现一次ms
;如果不是这种情况,请使用sub(/ms/,"",$NF)
),这只留下数值作为最后一个字段,并将k
和中进行的替换次数保存为l
。然后,在我们处理完整个输入之后,如果
k
设置了,那么如果发生了替换,我们就打印出的值l
,如果没有,我们就打印出no connection
。或者,您可以在开始时设置值
l
,然后打印它:要使原始方法有效,只需添加第二个字段作为条件并根据该条件设置变量。然后,当第二个字段存在时,您可以打印它,
no connection
如果变量未设置,则在最后打印。像这样: