Select 使用jq选择和筛选cloudflare页面规则

Select 使用jq选择和筛选cloudflare页面规则,select,filter,jq,cloudflare,Select,Filter,Jq,Cloudflare,我试图找出从Cloudflare中过滤出一些pagerules数据的最佳方法,虽然我已经找到了一个解决方案,但我看到了它有多丑陋,并认为“必须有一种更简单的方法来做到这一点。” 我特别想问的是使用jq实现以下目标的更好方法。我知道我可以使用一些编程库来完成同样的任务,但这个问题的重点是更好地理解jq是如何工作的 假设我有一个很长的CloudFlare pagerules记录列表,下面是一些条目作为一个简单的示例: { "example.org": [ {

我试图找出从Cloudflare中过滤出一些pagerules数据的最佳方法,虽然我已经找到了一个解决方案,但我看到了它有多丑陋,并认为“必须有一种更简单的方法来做到这一点。”

我特别想问的是使用jq实现以下目标的更好方法。我知道我可以使用一些编程库来完成同样的任务,但这个问题的重点是更好地理解jq是如何工作的

假设我有一个很长的CloudFlare pagerules记录列表,下面是一些条目作为一个简单的示例:

{
  "example.org": [
    {
      "id": "341",
      "targets": [
        {
          "target": "url",
          "constraint": {
            "operator": "matches",
            "value": "http://ng.example.org/*"
          }
        }
      ],
      "actions": [
        {
          "id": "always_use_https"
        }
      ],
      "priority": 12,
      "status": "active",
      "created_on": "2017-11-29T18:07:36.000000Z",
      "modified_on": "2020-09-02T16:09:03.000000Z"
    },
    {
      "id": "406",
      "targets": [
        {
          "target": "url",
          "constraint": {
            "operator": "matches",
            "value": "http://nz.example.org/*"
          }
        }
      ],
      "actions": [
        {
          "id": "always_use_https"
        }
      ],
      "priority": 9,
      "status": "active",
      "created_on": "2017-11-29T18:07:55.000000Z",
      "modified_on": "2020-09-02T16:09:03.000000Z"
    },
    {
      "id": "427",
      "targets": [
        {
          "target": "url",
          "constraint": {
            "operator": "matches",
            "value": "nz.example.org/*"
          }
        }
      ],
      "actions": [
        {
          "id": "ssl",
          "value": "flexible"
        }
      ],
      "priority": 8,
      "status": "active",
      "created_on": "2017-11-29T18:08:00.000000Z",
      "modified_on": "2020-09-02T16:09:03.000000Z"
    }
  ]
}
我要做的是提取嵌套在always\u use\u https操作的constraint.value字段中的URL。目标是提取值并将其作为json数组返回。我想到的是:

jq '[                                       
        [
                [
                        [
                                .[] | .[] | select(.actions[].id | contains("always_use_https"))
                        ] | .[].targets[] | select(.target | contains("url"))
                ] | .[] | .constraint | select(.operator | contains("matches"))
        ] | .[].value 
]'
根据我们的示例,这会产生:

[
  "http://ng.example.org/*",
  "http://nz.example.org/*"
]

在jq中有没有更简洁的方法来实现这一点?

这会根据我理解的标准产生预期的输出:

jq '.["example.org"]
    | map(select( any(.actions[]; .id == "always_use_https"))
          | .targets[]
          | select(.target == "url")
          | .constraint.value )
' cloudfare.json
谢谢,学习
map()
any()
操作符非常有用。我确实对您的改进做了一个额外的更改,那就是将
.constraint.value
更改为
.constraint | select(.operator==“matches”)|。value