2017-09-18 89 views
0

我有以下JSON:使用JQ选择对象不包含嵌套对象

{ 
"apiVersion": "v1", 
"items": [ 
    { 
     "apiVersion": "v1", 
     "kind": "Node", 
     "metadata": { 
      "annotations": { 
       "node.alpha.kubernetes.io/ttl": "0", 
       "volumes.kubernetes.io/controller-managed-attach-detach": "true" 
      }, 
      "creationTimestamp": "2017-09-14T11:53:07Z", 
      "labels": { 
       "beta.kubernetes.io/arch": "amd64", 
       "beta.kubernetes.io/os": "linux", 
       "kubernetes.io/hostname": "msl-kub01.int.na.myapp.com", 
       "node-role.kubernetes.io/master": "" 
      }, 
      "name": "msl-kub01.int.na.myapp.com", 
      "namespace": "", 
      "resourceVersion": "123154", 
      "selfLink": "/api/v1/nodes/msl-kub01.int.na.myapp.com", 
      "uid": "45e3b430-9943-11e7-bf0b-fa163e6604fc" 
     }, 
     "spec": { 
      "externalID": "msl-kub01.int.na.myapp.com", 
      "taints": [ 
       { 
        "effect": "NoSchedule", 
        "key": "node-role.kubernetes.io/master", 
        "timeAdded": null 
       } 
      ] 
     } 
    },  
    { 
     "apiVersion": "v1", 
     "kind": "Node", 
     "metadata": { 
      "annotations": { 
       "node.alpha.kubernetes.io/ttl": "0", 
       "volumes.kubernetes.io/controller-managed-attach-detach": "true" 
      }, 
      "creationTimestamp": "2017-09-14T12:05:42Z", 
      "labels": { 
       "beta.kubernetes.io/arch": "amd64", 
       "beta.kubernetes.io/os": "linux", 
       "kubernetes.io/hostname": "msl-kub02.int.na.myapp.com" 
      }, 
      "name": "msl-kub02.int.na.myapp.com", 
      "namespace": "", 
      "resourceVersion": "123156", 
      "selfLink": "/api/v1/nodes/msl-kub02.int.na.myapp.com", 
      "uid": "084f439e-9945-11e7-bf0b-fa163e6604fc" 
     }, 
     "spec": { 
      "externalID": "msl-kub02.int.na.myapp.com" 
     } 
    } 
], 
"kind": "List", 
"metadata": { 
    "resourceVersion": "", 
    "selfLink": "" 
}} 

,我需要选择不具有“项目”列表中的所有条目“ spec.taints []效果==” 。NoSchedule”

事情是污点名单和效果的关键在于存在不是在源JSON强制性的,所以我不能做:

select (.spec.taints[].effect != "NoSchedule") 

我希望使用这样的:

select (has(".spec.taints[].effect") | not) 

但这是不允许的。

Thx提示。

+0

发布最终预期结果 – RomanPerekhrest

回答

0

你可以使用?忽略任何错误,如果给定的属性或数组不存在。因此,考虑到这一点,请仔细阅读没有包含"NoSchedule"的污点效应的项目。

.items[] | select(all(.spec.taints[]?; .effect != "NoSchedule")) 
1

JQ解决方案:

jq '[.items[] | if (.spec | has("taints") | not) 
    or (.spec.taints[] | select(.effect!="NoSchedule")) then . else empty end]' your.json 

输出:

[ 
    { 
    "apiVersion": "v1", 
    "kind": "Node", 
    "metadata": { 
     "annotations": { 
     "node.alpha.kubernetes.io/ttl": "0", 
     "volumes.kubernetes.io/controller-managed-attach-detach": "true" 
     }, 
     "creationTimestamp": "2017-09-14T12:05:42Z", 
     "labels": { 
     "beta.kubernetes.io/arch": "amd64", 
     "beta.kubernetes.io/os": "linux", 
     "kubernetes.io/hostname": "msl-kub02.int.na.myapp.com" 
     }, 
     "name": "msl-kub02.int.na.myapp.com", 
     "namespace": "", 
     "resourceVersion": "123156", 
     "selfLink": "/api/v1/nodes/msl-kub02.int.na.myapp.com", 
     "uid": "084f439e-9945-11e7-bf0b-fa163e6604fc" 
    }, 
    "spec": { 
     "externalID": "msl-kub02.int.na.myapp.com" 
    } 
    } 
] 
0

这里是一个过滤器应该工作。

.items[] 
| select(.spec.taints | (.==null) or (any(.effect=="NoSchedule")|not))