JQ - как отображать объекты на основе значения объектов в массиве - PullRequest
0 голосов
/ 15 октября 2019

У меня есть файл 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 в вывод или как включить"и" часть выбора.

Ответы [ 2 ]

2 голосов
/ 15 октября 2019

Вот простой, но эффективный подход, использующий any:

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

Альтернативный подход, который избегает .Tags[]:

{"Key": "environment", "Value": "ops"} as $object
| select( .Tags | index($object) )
| .InstanceId
1 голос
/ 15 октября 2019

Я не уверен, что это именно тот результат, который вы ищете (прокомментируйте, если это не так), но это выведет InstanceId s объектов JSON, которые содержат Tag с Keyenvironment и Value ops.

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