【问题标题】:Retrieve data from JSON where list items have specific/known values using JQ使用 JQ 从 JSON 中检索列表项具有特定/已知值的数据
【发布时间】:2019-12-12 17:01:53
【问题描述】:

我有一个带有如下块的 JSON 文件

  {
    "id": 0000,
    "sGName": "SG1",

    "customProperties": [
      {
        "id": 100000,
        "name": "clustersIP",
        "value": "ABC"
      }
    ],

    "filters": [
      {
        "id": 74616,
        "attributeName": "serverName",
        "value": "Sever101"
      },
      {
        "id": 74617,
        "attributeName": "bigIPPool",
        "value": "server101v1"
      }
    ],

  },

我在 bash 中寻找 JQ 来检索 sGName,其中 "attributeName"="serverName" 和 "value"="Sever101" 有人可以帮忙吗?

我可能有多个“sGName”

【问题讨论】:

  • 请注意,虽然它可能发音为 Jason,但它写成 JSON,它是 JavaScript Object Notation 的首字母缩写
  • 感谢指正
  • 顺便说一句,请尝试编写足够具体的标题,以将您的特定问题与所有其他“我如何使用 jq 检索 X?”区分开来。问题。 (如果它不可区分,那么理论上,您应该能够使用其他问题的答案,而无需提出新的答案)。我现在已经尝试为此进行编辑。
  • 您的示例输入似乎不完整,并且您的问题中没有所需的输出

标签: json bash jq


【解决方案1】:

我相信您正在寻找以下命令:

jq --raw-output 'map( select(.filters | any(.attributeName == "serverName" and .value == "Sever101")) |.sGName) | join("\n")'

你可以try it here

将 serverName 标准提取为参数:

jq --raw-output --arg serverName "Sever101" 'map( select(.filters | any(.attributeName == "serverName" and .value == $serverName)) |.sGName) | join("\n")'

oguz ismail 提出了一个更精简的解决方案:

jq --raw-output --arg serverName "Sever101" '.[] | select(any(.filters[]; .attributeName=="serverName" and .value==$serverName)).sGName'

【讨论】:

  • 感谢您的代码。我们在哪里传递 ServerName 值?我的 Jason 文件将有多个服务器名称,因此必须按其值进行过滤
  • "serverName"替换为$s,并将调用调整为jq --arg s "serverName" ...;同样适用于"Server101"
  • map ... select ... length 可以很容易地替换为any
  • @oguzismail 谢谢,我确定我错过了一些更简单的东西,但我没有找到什么
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多