regex - 如何仅获取正则表达式 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
解决方案
如果您需要查找仅由 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 演示:
推荐阅读
- javascript - 我正在将对象属性的值从 false 更改为 true,但我的 v-show 条件并未反映这一点
- traefik - 我可以禁用指定路径的基本身份验证吗?
- php - 在PHP中的多维数组中合并取决于键值的数组
- powershell - 如何在 while 循环中附加 Web 请求结果
- php - 找到最多十度分离的最短路径
- netlogo - 如何报告链接之间的距离并将报告的值用于代码中的其他计算?
- html - 使 CSS 悬停工具提示超出其父级范围
- r - dplyr:按组汇总(总和)非常慢
- scala - 使用 Shapeless 的类与类型注释
- ruby-on-rails - 我正在尝试创建一种安全的方式来让特定用户成为管理员