【问题标题】:JQ - how to display objects based on on the value of objects in an arrayJQ - 如何根据数组中对象的值显示对象
【发布时间】:2019-10-14 21:53:11
【问题描述】:

我有一个如下所示的 JSON 文件:

{
  "InstanceId": "i-9KwoRGF6jbhYdZi823aE4qN",
  "Tags": [
    {
      "Key": "blah",
      "Value": "server-blah"
    },
    {
      "Key": "environment",
      "Value": "ops"
    },
    {
      "Key": "server_role",
      "Value": "appserver"
    },
    {
      "Key": "Name",
      "Value": "some_name"
    },
    {
      "Key": "product",
      "Value": "some_server"
    }
  ]
}
{
   ...more objects like the above...
}

我需要显示 InstanceId,其中“Key”==“environment”和“Value”==“ops”。 我有 jq-1.6。

如果我说:

cat source.json | jq '
   { InstanceId, Tags } |
   (.Tags[] | select( .Key == "environment" ))
'

我得到了一些我想要的东西,但我不知道如何在输出中包含 InstanceId,也不知道如何合并选择的“和”部分。

【问题讨论】:

  • 你试过.Tags | map(select(.Key == "environment" and .Value == "ops"))吗?

标签: json select jq


【解决方案1】:

这是一个使用any的简单但有效的方法:

select( any(.Tags[]; .Key=="environment" and .Value == "ops") )
| .InstanceId

避免.Tags[]的替代方法:

{"Key": "environment", "Value": "ops"} as $object
| select( .Tags | index($object) )
| .InstanceId

【讨论】:

  • 这两种方法都运作良好,让我对使用不同的方法大开眼界。谢谢。
【解决方案2】:

我不确定这是否是您正在寻找的确切输出(如果不是,请发表评论),但这将输出包含 TagKey 的 JSON 对象的 InstanceIds environmentValue ops.

jq 'select( .Tags[] | (.Key == "environment" and .Value == "ops")) | .InstanceId' < source.json

【讨论】:

  • 这与我最初的最接近。您纠正了我的错误.....谢谢!
  • 请注意,如果您只希望每个输入对象最多使用一次 .InstanceId,这种方法充其量是低效的,最坏的情况是可能会产生不需要的额外结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 2014-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多