我正在尝试使用" 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
我在俯瞰什么?谢谢!
答案 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组中,从而得到了收集的解析所需的数字。