我的 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中有一个类似的问题,但是那个没有使用解析命令,也没有答案。
对于数量有限且众所周知的子节点,我可以找到一种非常丑陋的方法来做到这一点:
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.
稍加努力,就可以将所有这些组合成一个巨大的正则表达式。
这不是我正在寻找的解决方案。但它可能对某人有用。