JSON字段为字符串或数组时如何用jq筛选AWS S3策略条目
解决方案
直接使用以下jq命令即可保留完整JSON结构,同时兼容字符串/数组类型的AWS字段完成筛选:
jq '.Statement |= map(select([.Principal.AWS] | flatten | all(. != "KEY1")))' /tmp/y
命令逻辑说明
.Statement |= map():对Statement数组做原地修改,保留外层Version等字段不变,避免破坏完整的S3策略结构select([.Principal.AWS] | flatten):把单条规则里的AWS字段统一包裹为数组后扁平化,不管原值是字符串还是数组都会被处理为标准数组格式,解决类型不一致的问题all(. != "KEY1"):筛选条件为转换后的AWS数组中所有元素都不等于KEY1,只要出现KEY1的规则都会被过滤,符合删除所有KEY1相关条目的需求
输出验证
执行上述命令后,输出结果与期望的最终JSON完全一致:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "arn1", "arn2", "arn3" ] }, "Action": [ "access1", "access2", "access3" ], "Resource": "arn:aws:s3:::bucket1/*" }, { "Effect": "Allow", "Principal": { "AWS": [ "arn1", "arn2", "arn3" ] }, "Action": "access4", "Resource": "arn:aws:s3:::bucket1" } ] }
内容的提问来源于stack exchange,提问作者Fransurbo
相关产品推荐
相关产品推荐

