【问题标题】:Match version number parts in grok在 grok 中匹配版本号部分
【发布时间】:2020-02-20 11:32:55
【问题描述】:

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

我尝试了什么:

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

Grok debugger 的结果: No Matches

我的预期:

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

【问题讨论】:

    标签: regex elasticsearch logstash logstash-grok elk


    【解决方案1】:

    版本号的部分是 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,因为(?&gt;...) 原子组将点匹配为浮点数的一部分,并且由于不允许回溯到原子组模式中,因此从不将其返回。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-02
      • 2015-01-06
      相关资源
      最近更新 更多