【问题标题】:How to filter an array of JSON objects with jq?如何使用 jq 过滤 JSON 对象数组?
【发布时间】:2017-09-06 08:12:14
【问题描述】:

我有以下 JSON 输入:

{
  "zk_kafka": [
    {
      "InstanceType": "t2.medium",
      "zkMemory": "16",
      "kafkaMemory": "8"
    },
    {
      "InstanceType": "t2.small",
      "zkMemory": "8",
      "kafkaMemory": "4"
    }
  ],
  "es_hdfs": [
    {
      "InstanceType": "t2.medium",
      "esMemory": "16",
      "hdfsMemory": "8"
    },
    {
      "InstanceType": "t2.small",
      "esMemory": "8",
      "hdfsMemory": "4"
    }
  ]
}

首先我想通过属性名称选择一个数组。然后我想通过属性InstanceType的值来选择数组的一个对象。

属性zk_kafka和值t2.medium的示例:

{
  "InstanceType": "t2.medium",
  "zkMemory": "16",
  "kafkaMemory": "8"
}

我知道如何选择数组:

jq .zk_kafka

但我不知道如何通过属性值过滤对象数组。

【问题讨论】:

  • 向我们展示您的输入和预期输出,而不是陈述X-Y 问题
  • 这次我为你写了问题,但下次阅读stackoverflow.com/help/mcve

标签: json jq


【解决方案1】:

使用select 过滤器jq

jq '.zk_kafka | .[] | select(.InstanceType == "t2.medium")'

使用--arg 选项将参数传递给查询以避免注入。

jq --arg instance "t2.medium" '.zk_kafka | .[] | select(.InstanceType == $instance)'

jq 有一个manual、一个tutorial 和一个cookbook

【讨论】:

  • 引用工作正常。但请记住,您必须根据sed的要求对正则表达式进行转义。
  • { "InstanceType": "t2.medium", "zkMemory": "16", "kafkaMemory": "8" }, { "InstanceType": "t2.small", "zkMemory" : "8", "kafkaMemory": "4" } 这是我的块。如果匹配 t2.medium 那么它应该给我整个块并且 t2.medium 将来自变量。在模式中我手动给了 t2.medium 并且它有效但不接受来自变量。
  • 既然已经有jq,为什么还要使用sed?忘记sedjq 就是您所需要的。编辑您的问题。显示完整的输入和完整的命令以及预期的输出。
  • { "zk_kafka": [ { "InstanceType": "t2.medium", "zkMemory": "16", "kafkaMemory": "8" }, { "InstanceType": "t2.小”,“zkMemory”:“8”,“kafkaMemory”:“4”}],“es_hdfs”:[{“InstanceType”:“t2.medium”,“esMemory”:“16”,“hdfsMemory”:“ 8" }, { "InstanceType": "t2.small", "esMemory": "8", "hdfsMemory": "4" } ] } 当匹配 t2.medium 时,我想要来自 zk_kafka 的块。
  • 预期输出为 { "InstanceType": "t2.medium", "zkMemory": "16", "kafkaMemory": "8" },
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-22
  • 1970-01-01
  • 2016-11-02
相关资源
最近更新 更多