我在 Ubuntu 上运行 Zabbix 代理(日志记录软件),并希望 ping 内部 IPIP/GRE 隧道以不断测量连接质量。
现在,Zabbix 代理默认不允许对内部隧道执行 ping 命令,但幸运的是,它们允许创建“用户参数”,基本上它允许您执行单个 unix shell 命令并将数据提供给您的软件。
为此,我需要运行 fping/ping 命令来检索 zabbix 的单个值。我希望此值为延迟的十进制秒数或毫秒数,或者在超过 1 秒时无连接时为 0。下面我已经制定了一个命令,该命令对隧道 IP 执行 5 次 ping,然后返回平均值。
(下面的 IP 地址是示例数据)这是我目前得到的信息:
fping -e -q -p 1000 -c 5 8.8.4.4 2> /dev/null | grep -oP '[0-9\.]+/([0-9\.]+)/[0-9\.]+$'
完整的返回字符串如下所示:
8.8.4.4 : xmt/rcv/%loss = 5/5/0%, min/avg/max = 2.78/2.94/3.19"
现在 grep 的结果是这样的:
2.78/2.94/3.19
我想始终如一地获得第二个值(上面的 2.94),那么我的问题是,在单个命令中执行此操作的最有效方法是什么?
答案1
我会使用sed
而不是grep
,因此您的过滤器变成:
... | sed -n 's%^.* = .* = .*/\(.*\)/.*%\1%pg'
笔记:-
- 因为我们正在匹配
/
字符,所以我用 替换了正常的字符串分隔符,以%
避免转义,从而简化表达式/
。 - 我们匹配整行并将其替换为两个等号后的两个斜杠之间的内容,在匹配字符串中和替换中用
\(
和分隔。\)
\1
-n
除了匹配的行( )以外,我们不会输出任何内容( )%pg
。
为了简化说明,我使用了.*
数字。您可以使用[0-9\.]+
,但您需要使用扩展 RE 和grep -rn ...
如果你以前没用过sed
,我建议本教程。
答案2
为什么不呢cut -d/ -f8
?例如:
echo '8.8.4.4 : xmt/rcv/%loss = 5/5/0%, min/avg/max = 2.78/2.94/3.19"' | cut -d/ -f8