匹配 grok 中的版本号部分

Match version number parts in grok

我想使用 grok 过滤器将版本字符串(例如 2.3.5)拆分为三个字段(major.minor.patch)。

我尝试了什么:

%{NUMBER:major}.%{NUMBER:minor}.%{NUMBER:patch}

来自 Grok debugger 的结果: No Matches

我的预期:

{
    major: 2,
    minor: 3,
    patch: 5
}

版本号的部分是 int 值,因此,使用 INT 而不是 NUMBER 是有意义的,它不仅匹配整数值。

此外,必须对点进行转义以匹配文字点。

使用

%{INT:major}\.%{INT:minor}\.%{INT:patch}

测试:

更多详情:

模式可用在logstash repository:

INT (?:[+-]?(?:[0-9]+))
BASE10NUM (?<![0-9.+-])(?>[+-]?(?:(?:[0-9]+(?:\.[0-9]+)?)|(?:\.[0-9]+)))
NUMBER (?:%{BASE10NUM})

因此,${NUMBER}... 产生的模式是

(?<![0-9.+-])(?>[+-]?(?:(?:[0-9]+(?:\.[0-9]+)?)|(?:\.[0-9]+))).(?<![0-9.+-])(?>[+-]?(?:(?:[0-9]+(?:\.[0-9]+)?)|(?:\.[0-9]+))).(?<![0-9.+-])(?>[+-]?(?:(?:[0-9]+(?:\.[0-9]+)?)|(?:\.[0-9]+)))

并且它 does not match the input string 因为 (?>...) 原子组将点匹配为浮点数的一部分并且永远不会返回它,因为不允许回溯到原子组模式中。