如何使用jq过滤JSON对象数组?

43

我有以下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

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


2
展示你的输入和期望输出,而不是提出“X-Y”问题 - Inian
这次我为你写了问题,但下次请阅读 https://stackoverflow.com/help/mcve - ceving
2个回答

68

使用 jqselect 过滤器:

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

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

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

jq提供了一个手册,一个教程和一个食谱


引用功能正常。但请记住,您必须根据sed的要求转义正则表达式。 - ceving
{ "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" } ] } 当匹配到 t2.medium 时,我想要从 zk_kafka 中的一个块。 - Rehan Ch
预期输出为 { "InstanceType": "t2.medium", "zkMemory": "16", "kafkaMemory": "8" }, - Rehan Ch
@shzyincu 你需要使用更新赋值运算符[| =](https://stedolan.github.io/jq/manual/#Assignment)。 - ceving
@ceving 如果我有一个数组,并且我必须在其父兄弟节点的条件下更新和嵌套属性,该怎么办? - shzyincu
显示剩余6条评论

0

或者,您也可以使用map()

jq '.zk_kafka | map(select(.InstanceType == "t2.medium"))' input.json

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接