在任何级别上用jq搜索字符串

时间:2019-01-17 21:56:41

标签: json amazon-web-services jq amazon-iam

我想使用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可以实现吗?如何实现?

1 个答案:

答案 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"
        }
      }
    ]
  }
}