regex - 多个自定义 grok 模式不匹配,但它们单独成功匹配?
问题描述
Grok 匹配单个自定义模式,但在自定义模式组合时匹配。
完整、有效、可验证的示例
样本数据:
OK 05/20 20:12:10:067 ABC_02~~DE_02 FGH_IJK jsmith _A0011
自定义模式:
MMDD [0-1][0-9]/[0-3][0-9]
THREAD _A\w+
他们分开工作;具体来说,这种模式本身就可以工作:
%{MMDD:mmdd}
// Result
{
"mmdd": [
[
"05/20"
]
]
}
...而且这种模式本身就有效:
%{THREAD:thread}
// Result
{
"thread": [
[
"_A0011"
]
]
}
..但在一起,他们失败了:
%{MMDD:mmdd} %{THREAD:keyword}
No Matches
令人费解。泰姆·基思 :^)
在这里测试: https ://grokdebug.herokuapp.com/
正则表达式资源: https ://regex101.com/
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
根据下面 Jeff Y 的评论进行编辑
注意更改keyword
为thread
// Grok Pattern
%{MMDD:mmdd}%{DATA}%{THREAD:thread}
// Result
{
"mmdd": [
[
"05/20"
]
],
"DATA": [
[
" 20:12:10:067 ABC_02~~DE_02 FGH_IJK jsmith "
]
],
"thread": [
[
"_A0011"
]
]
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
编辑 2 基于 Jeff Y 在下面的第二条评论
// Data - HACKED - Note move of _A0011 to after mm/dd
OK 05/20 _A0011 20:12:10:067 ABC_02~~DE_02 FGH_IJK jsmith
// Grok Pattern
%{MMDD:mmdd} %{THREAD:thread}
// Result
{
"mmdd": [
[
"05/20"
]
],
"thread": [
[
"_A0011"
]
]
}
解决方案
Grok 将针对整个消息测试您的模式。
如果您的消息是OK 05/20 _A0011 20:12:10:067 ABC_02~~DE_02 FGH_IJK jsmith
并且您只想要05/20
and_A0011
部分,那么您的 grok 应该具有匹配字符串其余部分的模式,但不要将它们保存在字段中。
例如,模式%{WORD}%{SPACE}%{MMDD:mmdd}%{SPACE}%{THREAD:thread}%{SPACE}%{GREEDYDATA}
将匹配您的字符串,它将保存mmdd
和thread
字段,但忽略其他所有内容。
推荐阅读
- discord - Discord.js - 检查用户是否静音/静音更改
- php - 在不发送公共请求中的 id 的情况下获取模型数据的最佳方法是什么?
- nestjs - 在 Nest JS 中模拟存储库
- ruby - Rails 6 删除特定错误 - delete(:email)
- vba - 继续在 TextBox 中循环以从数据库、MS Access 中搜索多个值
- c - 如何在 Doxygen 中正确使用 EXCLUDE_SYMBOLS
- c - C 中的 fork——令人困惑的输出
- .net - .Net Core 中的两因素身份验证 - 如何验证令牌
- html - 我无法弄清楚导航栏中的哪个元素有不需要的边距/填充
- c# - 我怎样才能摆脱这些 else if 语句并使代码看起来更好?