如何使用jq过滤唯一值?

时间:2017-03-09 23:14:52

标签: bash gcloud jq

我正在使用gcloud describe命令来获取有关实例的元数据信息。使用jq过滤json响应的最佳方法是获取实例的名称 - 如果它包含“kafka”作为键。

.name +“”+ .metadata.items []?。key |选择(包含( “卡夫卡”))'

基本上,如果项目包含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
    }
  ],

2 个答案:

答案 0 :(得分:3)

我确信使用jq可以实现这一点,但通常使用内置格式和过滤会更容易使用gcloud列表:

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

--filter会告诉您要选择哪些项目;在这种情况下,它抓取实例元数据,查看项目,并检查包含kafka的项的键(而不是使用=来查找完全 {的键{1}})。

kafka告诉您从每个匹配的项目中只抓取一个--format(而不是表格,JSON,YAML);该项目将是实例的value()

您可以通过namegcloud topic filtersgcloud topic formats了解详情。

答案 1 :(得分:1)

以下是一个简单的jq解决方案,使用 if any

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