2

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

我尝试了什么:

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

Grok 调试器的结果: No Matches

在此处输入图像描述 我所期望的:

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

1 回答 1

1

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

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

利用

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

测试:

在此处输入图像描述

更多细节:

这些模式在logstash 存储库中可用:

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]+)))

并且它与输入字符串不匹配,因为(?>...)原子组将点作为浮点数的一部分进行匹配,并且由于不允许回溯进入原子组模式,因此从不将其返回。

于 2019-10-24T07:35:19.500 回答