【问题标题】:How to get only the first match of a regex Grok filter如何仅获取正则表达式 Grok 过滤器的第一个匹配项
【发布时间】:2020-03-06 08:03:14
【问题描述】:

目标

我想用 logstash Grok 从这条消息中只检索这个字符串“14”

3/03/0 EE 14 GFR 20 AAA XXXXX 50 3365.00

这是我的 grok 代码

grok{
 match => {
        field1 => [
          "(?<number_extract>\d{0}\s\d{1,3}\s{1})"       
        ]         
      }
}

我只想匹配第一个匹配“14”,但我的 Grok 过滤器返回所有匹配项:

14 20 50

【问题讨论】:

    标签: regex logstash logstash-grok


    【解决方案1】:

    如果您需要查找仅由 1、2 或 3 位数字组成的数字的第一次出现,您可以使用

    ^(?:.*?\s)?(?<number_extract>\d{1,3})(?!\S)
    

    详情

    • ^ - 字符串开头
    • (?:.*?\s)? - 任何 0+ 字符的可选子字符串,除了换行符,尽可能少,然后是空格(如果存在,则可以在字符串的开头进行匹配)
    • (?&lt;number_extract&gt;\d{1,3}) - 1 到 3 位数字
    • (?!\S) - 一个否定的前瞻,确保右侧有一个空格或字符串结尾(在字符串结尾启用匹配)。

    替代解决方案

    如果您知道要查找的数字位于类似日期的字段和另一个字段之后,并且您想强制进行此预验证,则可以使用

    ^\d+/\d+/\d+\s+\S+\s+(?<number_extract>\d+)
    

    regex demo

    如果您不必检查第一个字段是否类似于日期,您可以简单地使用

    ^\S+\s+\S+\s+(?<number_extract>\d+)
    ^(?:\S+\s+){2}(?<number_extract>\d+) // Equivalent
    

    the regex demo here

    详情

    • ^ - 字符串开头
    • \d+/\d+/\d+ - 1+ 位,/,1+ 位,/,1+ 位
    • \s+ - 1+ 个空格
    • \S+ - 1+ 字符而不是空格
    • \s+ - 1+ 个空格
    • (?&lt;number_extract&gt;\d+) - 捕获组“number_extract”:1+ 位。

    Grok 演示:

    【讨论】:

      猜你喜欢
      • 2013-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-20
      • 2020-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多