【问题标题】:How to filter unique values with jq?如何用 jq 过滤唯一值?
【发布时间】:2017-03-09 23:14:51
【问题描述】:

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

.name + " " + .metadata.items[]?.key |选择(包含(“kafka”))'

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

【问题讨论】:

  • jq 有一个unique 函数。
  • 给定的 sn-p 不包含“名称”并且确实不是有效的 JSON。请提供一个最小的完整可验证示例(请参阅stackoverflow.com/help/mcve)。

标签: bash gcloud jq


【解决方案1】:

我确信 jq 可以做到这一点,但总的来说,使用内置格式和过滤功能会更轻松地使用 gcloud 列表:

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

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

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

您可以通过运行gcloud topic filtersgcloud topic formatsgcloud topic projections 了解更多信息。

【讨论】:

    【解决方案2】:

    这是一个使用 ifany 的简单 jq 解决方案:

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

    【讨论】:

      猜你喜欢
      • 2022-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多