(斯普伦克)如何使用 rex 命令对双引号括起来的通配符进行模式匹配?

(Splunk) How can I use the rex command to pattern match wildcards enclosed by double quotes?

提问人:fewrgw5yu 提问时间:4/21/2023 最后编辑:fewrgw5yu 更新时间:4/26/2023 访问量:1142

问:

编辑 - 我已经通过解决方法解决了这个问题,但也会尝试您的建议,看看我更喜欢哪一个。我在Splunk中经历了“提取新字段”的过程,并手动突出显示了我想要的数据,然后复制了自动生成的相应正则表达式语句并直接使用

我在使用 rex 命令匹配 Splunk 搜索字符串中的模式并将它们输出到 |table 命令中时遇到了一些问题。Regex101.com 表明,这种模式匹配在两种PCRE协议上都是正确的。我正在尝试匹配双引号内的值。双引号在 splunk 查询中使用斜杠进行转义。

带有通配符的源消息:“早餐表 * 中的错误,表名称 \”*\”。敏捷的棕色狐狸跳过了懒惰的狗。\“*\” 数据的最大长度当前设置为 * 热狗,但面包长度为 * 英寸。将 \“*\” 包子的最大长度增加到至少 * 英寸,然后重试。

用双引号括起来的星号是简单的字符串:一个字母、两个字母、多字等,独立的星号只是代表数字。

这有效: |rex “早餐表错误 (?<breakfast_table>\d+)” |将breakfast_table重命名为“BT” 这不起作用: |rex “表名 ”(?<table_name>[^“]*)”“ |将table_name重命名为“TN”

当我在表中查看 rex 语句 1 和 4 时,它们会正确显示数字。rex 语句 2 和 3 返回 NULL 并且不显示任何内容,即使 regex101(以及 chatGPT 的价值)似乎对我正在使用的正则表达式没有问题。

| search Message="Error in breakfast table *, table name \"*\". The quick brown fox jumped over the lazy dog. The maximum length of the \"*\" data is currently set to * hotdogs, but the bun length is * inches. Increase the maximum length of the \"*\" bun to at least * inches and retry.*"

| rex "Error in breakfast table (?<breakfast_table>\d+)" | rename breakfast_table as "BT"

| rex "table name \"(?<table_name>[^\"]*)\"" | rename table_name as "TN"
| rex "maximum length of the \"(?<max_bunlength>[^\"]*)\"" | rename max_bunlength as "MB"

| rex "data is currently set to (?<current_length>\d+)" | rename current_length as "Current Length"

 

我已经在 regex101.com 上确认了我测试的正则表达式模式与我的预期相匹配。我已经在Splunk查询上直接尝试并错误地使用了许多不同的正则表达式模式,但无济于事。

匹配 1 将捕获整个子字符串,而 Group table_name 将正确捕获我想要的值。

例如,真实消息可能会正确插入以下值作为通配符:“email to”或“message id”,并且在 regex101 -> |rex “(?<max_bunlength>[^”]*)“的最大长度” |将max_bunlength重命名为“MB” 我将正确看到以下匹配项

匹配 1:“电子邮件收件人”的最大长度 团体max_bunlength:发送电子邮件至

然而,这个max_bunlength变量显示显示表中每条记录的 NULL 值

正则表达式 搜索 匹配 Splunk Rex

评论

0赞 RichG 4/21/2023
该字段为 NULL,因为该字段已重命名为 。max_bunlengthMB
1赞 warren 4/21/2023
为什么要提取一个字段只是为了立即重命名它?无需提取并重命名为 ,只需提取max_bunlengthMBMB
0赞 fewrgw5yu 4/24/2023
@warren 当我在查询末尾的 |table 语句中使用它时,我重命名了它以提高可读性。
0赞 fewrgw5yu 4/24/2023
@RichG我不这么认为 - 其他字段被重命名并填充数据就好了。
1赞 RichG 4/24/2023
如果使用正确的名称时该字段为 NULL,则表示数据未从原始事件中提取到该字段中。仔细检查正则表达式和用于填充字段的任何其他命令。请考虑共享完整查询。

答:

0赞 warren 4/23/2023 #1

这些命令应该有效:rex

| rex field=Message "rror in \w+\s\w+\s(?<error>[^,]+)"
| rex field=Message ", table name\s[^\"]+(?<table_name>[^,]+?)\"\."
| rex field=Message "The maximum[^\"]+\"(?<max_bun_length>[^\"]+)"
| rex field=Message "data is currently set to (?<current_length>\S+)"