我想使用jq
提取键Action
在JSON文件中的所有外观。 Action
在JSON中的不同路径(或具有不同值的相同路径键结构)中多次出现。
用例是提取所有授予*
权限的IAM策略。
我想选择.Action为值“ *”或为以"*"
为元素的数组的情况,例如
"Action":["not this", "*", "not that"]
此外,最好在上面的某些级别包含包含"Action"
的JSON片段。
例如此JSON:
{
"AssumeRolePolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Action": "*",
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
}
}
]
},
...
它将被提取
{
"AssumeRolePolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Action": "*",
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
}
}
]
},
...
}
jq
可以实现吗?如何实现?
答案 0 :(得分:1)
[此部分按照最初的措辞,即当问题专门询问到感兴趣对象的路径时,才解决该问题。]
paths(objects and has("Action")
and (.Action == "*" or (.Action|index("*")))) as $path
| [ $path, getpath($path)]
. as $in
| reduce paths(objects and has("Action")
and (.Action == "*" or (.Action|index("*")))) as $path
({}; setpath($path; $in | getpath($path)))
给出与Q中所示类似的输入,紧接上方的过滤器将产生:
{
"AssumeRolePolicyDocument": {
"Statement": [
{
"Action": "*",
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
}
}
]
}
}