Разбор JSON с проблемами jq if-then-else

Я пишу скрипт, который будет анализировать файл JSON и извлекать некоторые имена контейнеров докеров и серверы, на которых они работают. Затем мне нужно сделать некоторые другие вещи в bash с информацией, которую я получаю. Я новичок в использовании jq но вот что я получил до сих пор.

Я запускаю следующее:

cat env.json | jq '[.env.service.config | .[] | {dockerContainerName:.dockerConfig.dockerImageName,servers:[.allocation[].serverName]}]'

Это дает мне вывод:

[
  {
    "dockerContainerName": null,
    "servers": []
  },
  {
    "dockerContainerName": "my_awesome_container",
    "servers": [
      "serverX01",
      "serverX02"
    ]
  },
...
...
]

Как видно из результата, некоторые из конфигов службы не имеют dockerConfig.dockerImageName. Мне нужно ограничить то, что возвращается, чтобы отфильтровать те, которые не имеют dockerConfig. Я пытался использовать if-then-else, но не могу заставить его работать правильно.

Есть идеи?

1 ответ

Решение

Ты можешь использовать selectограничить содержимое массива объектами, чьи dockerContainerName отличается от null:

jq '.[] | select(.dockerContainerName != null)' <<EOF
[
  {
    "dockerContainerName": null,
    "servers": []
  },
  {
    "dockerContainerName": "my_awesome_container",
    "servers": [
      "serverX01",
      "serverX02"
    ]
  }
]
EOF

{
  "dockerContainerName": "my_awesome_container",
  "servers": [
    "serverX01",
    "serverX02"
  ]
}
Другие вопросы по тегам