如何使用 CloudWatch Insights Regex 在第一次匹配后不返回,而是返回一个集合

问题描述 投票:0回答:1

我的 CloudWatch 日志中有很多行是这样的 JSON 对象:

{
    "friends": [
        { "name": "bob"},
        { "name": "steve"},
        { "name": "joe" }
    ]
}

使用 CloudWatch Regex 表达式,我想提取所有名称。 我已经有一个正则表达式可以返回我想要的值:

/"name":[ ]*"([^"]*)"/g

如您所见,在此链接中运行:https://regex101.com/r/Bb28Pg/2

使用 CloudWatch 语法,正则表达式变成这个命令:

fields @message
| filter @message like /"friends":/
| parse @message /"name":[ ]*"(?<@name>[^"]*)"/

但是这个表达式只返回名字,示例中的“bob”。我想得到他们。我尝试在表达式末尾添加

/g
,但这没有帮助。我试图在官方文档中找到一些信息https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_QuerySyntax.html,但我找不到与此主题相关的任何信息。

Cloudwatch Insights search in multiline logs中有一个类似的问题,但是那个没有使用解析命令,也没有答案。

regex amazon-web-services amazon-cloudwatch amazon-cloudwatchlogs
1个回答
0
投票

对于数量有限且众所周知的子节点,我可以找到一种非常丑陋的方法来做到这一点:

fileds @message
| filter @message like /"friends":/
| parse @message /"name":[ ]*"(?<@name1>[^"]*)"/
| parse @message /"name"(?:(?!"name")(.|\n))+]*"name":[ ]*"([?<@name2>^"]*)/
| parse @message /"name"(?:(?!"name")(.|\n))+]*"name"(?:(?!"name")(.|\n))+]*"name":[ ]*"(?<@name3>[^"]*)/ 

基本上,它说:搜索名称关键字,然后继续搜索任何不是名称关键字的内容,然后提取第二个名称关键字后引号之间的所有内容。以与

@name3
类似的方式,但现在,跳转到关键字。您可以在此链接中使用此正则表达式https://regex101.com/r/Bb28Pg/3.

稍加努力,就可以将所有这些组合成一个巨大的正则表达式。

这不是我正在寻找的解决方案。但它可能对某人有用。

© www.soinside.com 2019 - 2024. All rights reserved.