在Linux中使用grep返回特定的匹配(子)值

在Linux中使用grep返回特定的匹配(子)值

我在 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

相关内容