在collectd中使用tail插件的POSIX ERE正则表达式

时间:2018-01-04 20:27:34

标签: regex posix collectd

我正在尝试使用" tail"来匹配文件中的特定值。收集插件。此插件仅支持POSIX ERE语法。示例文件如下:

capture.kernel_packets                     | Total                     | 25496291490
capture.kernel_drops                       | Total                     | 873229305

尝试#1:

capture\.kernel_packets.*Total.*\|\s+(\d+)

我想提取价值" 25496291490"在第一个捕获组中。

尝试#2:

capture\.kernel_packets.*Total.*\|\s+(\d+)\1

似乎只抓住了全场比赛。以下工作但POSIX ERE不支持:

capture\.kernel_packets.*Total.*\|\s+\K\S+

https://collectd.org/documentation/manpages/collectd.conf.5.shtml#plugin_tail http://www.boost.org/doc/libs/1_44_0/libs/regex/doc/html/boost_regex/syntax/basic_extended.html

我在俯瞰什么?谢谢!

1 个答案:

答案 0 :(得分:0)

我认为您的第一次尝试已经结束。

我怀疑您可能会忽略的是需要两次将字符串转义以用于收集/尾部。让我解释一下。

首先,收集的代码正在编译带有标志的regex字符串

REG_EXTENDED | REG_NEWLINE

但是,您在Regex字段的tail.conf文件中提供的字符串也不是实际的正则表达式。它是适合在C语言中使用的字符串,因此您必须了解2个单独的转义级别。

1)扩展Regex语法要求的转义,例如如果您想使用其中一种

.[{}()\*+?|^$ 

然后您需要使用\

对其进行转义

例如,如果您要使用实际字符'*',则正则表达式要求您输入'\*',这样编译器就会知道您的意思是“星号”而不是“ regex零-或更多重复”。

2)但是,您还需要使用C语言进行转义。

因此,要在正则表达式字符串中生成实际字符'|',您需要像'\|'这样对其进行转义。为了将tail.conf文件中的正则表达式字符串作为C字符串提供,您需要再次对其进行转义'\\|'。

所以您需要此正则表达式字符串:

capture\.kernel_packets.*Total.*\|\s+([0-9]+)

您将在tail.conf中提供额外的C转义,例如:

capture\\.kernel_packets.*Total.*\\|\\s+([0-9]+)

整个字符串都已匹配,并且您想要的数字最终出现在第1组中,从而得到了收集的解析所需的数字。