【问题标题】:Search string with jq on any level在任何级别使用 jq 搜索字符串
【发布时间】:2019-01-17 21:56:41
【问题描述】:

我想使用 jq 提取 JSON 文件中键 Action 的任何外观。 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 实现吗?如何实现?

【问题讨论】:

  • 是的,这一切都是可以实现的,但是不清楚你是指文字字符串值“.”还是你的意思是“.”字符串匹配的意义(“globbing”)。另外,请指定输出格式。简而言之,如果您遵循minimal reproducible example 指南,将会有所帮助。谢谢。
  • 它的字面值*。我已经更新了我的问题,希望更清楚。

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


【解决方案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"
        }
      }
    ]
  }
}

【讨论】:

  • 这是一个很好的答案,谢谢。我投了赞成票。不喜欢选择作为答案,因为不幸的是我仍然需要工作,但它指向正确的方向。真诚的感谢!
  • 我已经发起了一个聊天,以防你想详细回答:chat.stackoverflow.com/rooms/186935/room-for-arod-and-peak
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多