如何只获得正则表达式 Grok 过滤器的第一个匹配项

How to get only the first match of a regex Grok filter

目标

我只想使用 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 过滤器 returns 所有匹配项:

14 20 50

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

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

详情

  • ^ - 字符串开头
  • (?:.*?\s)? - 除换行符之外的任何 0+ 个字符的可选子字符串,尽可能少,然后是空格(如果存在,这会在字符串的开头启用匹配)
  • (?<number_extract>\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+ 个空格
  • (?<number_extract>\d+) - 捕获组 "number_extract":1+ 位数字。

Grok 演示: