Разбор Jq: выбор объекта из списка объектов на основе критериев

У меня есть такой JSON.

{
  "servers": [
    {
      "id": "1",
      "addresses": {
        "services_z1": [
          {
            "OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:bc:db:7d",
            "addr": "10.3.3.18",
            "version": 4,
            "OS-EXT-IPS:type": "fixed"
          }
        ]
      }

    },

    {
      "id": "2",
      "addresses": {
        "services_z1": [
          {
            "OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:bc:db:7d",
            "addr": "10.3.3.19",
            "version": 4,
            "OS-EXT-IPS:type": "fixed"
          }
        ]
      }

    },

    {
      "id": "3",
      "addresses": {
        "services_z1": [
          {
            "OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:bc:db:7d",
            "addr": "10.3.3.20",
            "version": 4,
            "OS-EXT-IPS:type": "fixed"
          }
        ]
      }

    },

    {
      "id": "4",
      "addresses": {
        "services_z1": [
          {
            "OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:bc:db:7d",
            "addr": "10.3.3.21",
            "version": 4,
            "OS-EXT-IPS:type": "fixed"
          }
        ]
      }

    }

    ]

}

Я пытаюсь найти идентификатор сервера, для которого значение адреса равно 10.3.3.18. Как я могу этого добиться?

Я знаю, что это будет что-то вроде jq '.servers[] | выбрать (некоторые критерии)'

Но я не могу сформировать эти критерии.

Любой указатель будет огромной помощью.


jq
person Subhankar    schedule 30.11.2015    source источник
comment
Не забудьте принять ответ, если он решает ваш вопрос.   -  person Paul Wagland    schedule 01.12.2015
comment
Привет, Павел, спасибо за ваш ответ. Извините, меня не было на станции в течение недели, я проверю и дам вам знать.   -  person Subhankar    schedule 08.12.2015


Ответы (1)


Вы хотите что-то вроде следующего:

jq '.servers[]|select(.addresses.services_z1[].addr=="10.3.3.18")|.id'

Это говорит о том, что нужно просмотреть все серверы, сопоставить те, у которых есть .addresses.services_z1[].addr=="10.3.3.18", а затем распечатать идентификатор этих серверов.

person Paul Wagland    schedule 30.11.2015
comment
Привет, Пол, в моем JSON есть несколько серверов, у которых вообще нет узла services_z1 под узлом адресов. Текущий запрос выдает ошибку jq: ошибка: не удается выполнить итерацию по нулевому значению. Как мы можем сделать это лучше - person Subhankar; 08.12.2015
comment
Я пробовал это .servers[] | выберите (.addresses.services_z1! = ноль) | select(.addresses.services_z1[].addr==\$FIXED_IP\) | .id Это работает для меня, поскольку я отфильтровываю те, у которых нет узла с именем services_z1 по адресам. - person Subhankar; 08.12.2015