我想使用 grok 过滤器将版本字符串(例如 2.3.5)拆分为三个字段(major.minor.patch)。
我尝试了什么:
%{NUMBER:major}.%{NUMBER:minor}.%{NUMBER:patch}
Grok 调试器的结果:
No Matches
{
major: 2,
minor: 3,
patch: 5
}
我想使用 grok 过滤器将版本字符串(例如 2.3.5)拆分为三个字段(major.minor.patch)。
我尝试了什么:
%{NUMBER:major}.%{NUMBER:minor}.%{NUMBER:patch}
Grok 调试器的结果:
No Matches
{
major: 2,
minor: 3,
patch: 5
}
版本号的部分是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]+)))
并且它与输入字符串不匹配,因为(?>...)
原子组将点作为浮点数的一部分进行匹配,并且由于不允许回溯进入原子组模式,因此从不将其返回。