2017-03-09 115 views
0

我正在使用gcloud describe命令來獲取有關實例的元數據信息。用jq過濾json響應以獲取實例的名稱的最佳方式是什麼 - 如果它包含「kafka」作爲鍵。如何用jq過濾唯一值?

.name +「」+ .metadata.items [] ?. key | select(contains(「kafka」))'

基本上如果項目包含kafka打印名稱。這只是json文件的一小段摘錄。

"metadata": { 
    "fingerprint": "xxxxx=", 
    "items": [ 
     { 
     "key": "kafka", 
     "value": "xxx=" 
     }, 
     { 
     "key": "some_key", 
     "value": "vars" 
     } 
    ], 
    "kind": "compute#metadata" 
    }, 
    "name": "instance-name", 
    "networkInterfaces": [ 
    { 
     "accessConfigs": [ 
     { 
      "kind": "compute#accessConfig", 
      "name": "External NAT", 
      "natIP": "ip", 
      "type": "ONE_TO_ONE_NAT" 
     } 
     ], 
     "kind": "compute#networkInterface", 
     "name": "", 
     "network": xxxxx 
    } 
    ], 
+0

JQ具有['unique'](https://stedolan.github.io/jq/manual/#unique ,unique_by \(path_exp \))函數。 –

+0

給定片段不包含「名稱」,實際上不是有效的JSON。請提供一個最小完整的可驗證示例(請參閱http://stackoverflow.com/help/mcve)。 – peak

回答

3

我敢肯定,這是可能的jq,但與gcloud列出了一般的工作將會使用更容易內置的格式化和過濾:

$ gcloud compute instances list \ 
    --filter 'metadata.items.key:kafka' \ 
    --format 'value(name)' 

--filter告訴你哪些項目選擇;在這種情況下,它抓取實例元數據,查看項目,並檢查包含kafka的密鑰(使用=代替,正好爲kafka)。

--format告訴您從每個匹配項目中抓取一個value()(與表,JSON,YAML相對);該項目將是實例的name

您可以通過運行gcloud topic filters,gcloud topic formatsgcloud topic projections來了解更多信息。

0

下面是使用如果任何簡單JQ溶液:

 if .metadata.items | any(.key == "kafka") then . else empty end 
    | .name