Выбрать все ключи в подобъектах - PullRequest
1 голос
/ 03 августа 2020

Я не понимаю, как работает jq. Я очень стараюсь, но не понимаю. См. Ниже, как я сейчас создаю запрос jq.

Итак, это мой JSON, и я просто хочу извлечь ключи name во всех подобъектах

{
  "checkpassword": {
    "checkpassword": {
      "containers": [
        {
          "name": "checkpassword",
          "exists": "true",
          "running": "true"
        }
      ],
      "projectdir": "true",
      "nginxdef": "true"
    }
  },
  "reverse_proxy": {
    "reverse_proxy": {
      "containers": [
        {
          "name": "reverse_proxy",
          "exists": "true",
          "running": "true"
        }
      ],
      "projectdir": "true"
    }
  }
}

Сам отказался от попыток, зря трачу на это время. Я чувствую, что многие пользователи находятся в такой же ситуации.

Любая помощь приветствуется.

.

NB: вот как я разрабатываю свои запросы:

root@priv  …/newProject   master  san_listProjects | jq -r '.[] | select( any(.name)'
jq: error: syntax error, unexpected $end, expecting ';' or ')' (Unix shell quoting issues?) at <top-level>, line 1:
.[] | select( any(.name)
jq: 1 compile error
 root@priv  …/newProject   master  san_listProjects | jq -r '.[] | select( any(".name")'
jq: error: syntax error, unexpected $end, expecting ';' or ')' (Unix shell quoting issues?) at <top-level>, line 1:
.[] | select( any(".name")
jq: 1 compile error
 root@priv  …/newProject   master  san_listProjects | jq -r '.[] | select( any("name")'
jq: error: syntax error, unexpected $end, expecting ';' or ')' (Unix shell quoting issues?) at <top-level>, line 1:
.[] | select( any("name")
jq: 1 compile error
 root@priv  …/newProject   master  san_listProjects | jq -r '.[] | select(any("name")'
jq: error: syntax error, unexpected $end, expecting ';' or ')' (Unix shell quoting issues?) at <top-level>, line 1:
.[] | select(any("name")
jq: 1 compile error
 root@priv  …/newProject   master  san_listProjects | jq -r '. | select(any("name")'
jq: error: syntax error, unexpected $end, expecting ';' or ')' (Unix shell quoting issues?) at <top-level>, line 1:
. | select(any("name")
jq: 1 compile error
 root@priv  …/newProject   master  san_listProjects | jq -r '. | select(any(".name")'
jq: error: syntax error, unexpected $end, expecting ';' or ')' (Unix shell quoting issues?) at <top-level>, line 1:
. | select(any(".name")
jq: 1 compile error
 root@priv  …/newProject   master  san_listProjects | jq -r '. | select(any(.name)'
jq: error: syntax error, unexpected $end, expecting ';' or ')' (Unix shell quoting issues?) at <top-level>, line 1:
. | select(any(.name)
jq: 1 compile error

1 Ответ

2 голосов
/ 03 августа 2020

Проблема с вашей попыткой состоит в том, что ни ., ни .[] не позволяет вам получить доступ к ключам объектов, вложенных на уровне .name присутствует ключ. Также у вас отсутствует закрытие ) для всех вызовов функции select.

Есть несколько способов сделать это. Один из способов - сопоставить путь, ведущий к ключу name, и получить значение этого пути

(paths | select( .[-1] == "name")) as $path | getpath($path)

jqplay Demo

или, как указано в комментариях, просто используйте встроенный рекурсивный спуск recurse и выберите объекты с полями, содержащими .name ключ

recurse | select(has("name")?).name
...