首页 > 解决方案 > 如何仅获取正则表达式 Grok 过滤器的第一个匹配项

问题描述

目标

我想用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

标签: regexlogstashlogstash-grok

解决方案


如果您需要查找仅由 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+)

查看正则表达式演示

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

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

请参阅此处的正则表达式演示

细节

  • ^- 字符串的开始
  • \d+/\d+/\d+- 1+ 位, /, 1+ 位, /, 1+ 位
  • \s+- 1+ 空格
  • \S+- 除空格外的 1+ 个字符
  • \s+- 1+ 空格
  • (?<number_extract>\d+)- 捕获组“number_extract”:1+ 位。

Grok 演示:

在此处输入图像描述


推荐阅读