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