Выбор объектов из списка с помощью jq на основе значения, доступ к объекту верхнего уровня - PullRequest
0 голосов
/ 09 апреля 2020

Итак, у меня есть такая структура:

[
{
  "name": "aaaaa",
  "type": "A",
  "class": "IN",
  "status": "NOERROR",
  "data": {
    "answers": [
      {
        "ttl": 30,
        "type": "CNAME",
        "class": "IN",
        "name": "aaaaa",
        "data": "bbbbb"
      },
      {
        "ttl": 1800,
        "type": "CNAME",
        "class": "IN",
        "name": "bbbbb",
        "data": "ccccc"
      },
      {
        "ttl": 60,
        "type": "A",
        "class": "IN",
        "name": "ccccc",
        "data": "1.2.3.4"
      }
    ],
},
{
  "name": ...
...

В основном это список данных разрешения DNS.

Для каждого вопроса может быть более одного ответа. Все, что меня волнует, это запись type: "A". После небольшой работы и чтения я придумал следующее:

. | select(
    (.status = "NOERROR") and
    (.class = "IN") and
    (.data.answers? != null)) | select(.data.answers | map(select(.type == "A")))

Это работает, чтобы дать мне только те объекты, тип которых "A". Однако из-за способа, которым я его построил, я теряю значение «name» верхнего уровня. Единственное возвращаемое значение - это сами фактические answer объекты, объекты в answers[]

Проблема в том, что мне нужно получить доступ к исходному значению имени (верхнего уровня). Я упускаю что-то простое здесь, может кто-нибудь помочь мне?

Спасибо

РЕДАКТИРОВАТЬ: То, что я хочу распечатать в конце, в основном значение .name верхнего уровня и каждое значение .data где type == "A". Вероятно, есть гораздо более простой способ сделать это, поэтому, если есть совершенно другой подход, я тоже рад это слышать!

РЕДАКТИРОВАТЬ 2: Я изначально думал, что это будет проще, и сделал:

. | select(
  (.status = "NOERROR") and
  (.class = "IN") and
  (.data.answers? != null) and
  (.data.answers[].type=="A")) | .

... но это возвращает весь список значений A, CNAME и других типов, если, кажется, присутствует только один A. Так что не повезло

1 Ответ

1 голос
/ 09 апреля 2020

Однако из-за способа, которым я его построил, я теряю значение "name" верхнего уровня

Тогда оставайтесь на верхнем уровне.

.[]
| select(.class == "IN" and .status == "NOERROR")
| .name + ": " + (.data.answers[] | select(.type == "A") .data)?
...