Как извлечь по ключу в объекте на родного брата? - PullRequest
0 голосов
/ 10 марта 2020

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

это входные данные из журнала Ansible:

(формат журнала был задан переменной env ANSIBLE_STDOUT_CALLBACK=json)

Я хочу связать name с msg, но только для хоста 192.169.1.170.

{
    "plays": [
        {
            "tasks": [
                {
                    "hosts": {
                        "192.169.1.70": {
                            "msg": "inventory_hostname:192.169.1.70:"
                        },
                        "dontcare": {
                            "msg": "dont want to see this:"
                        }
                    },
                    "task": {
                        "name": "debug inventory_hostname"
                    }
                },
                {
                    "hosts": {
                        "192.169.1.70": {
                            "msg": "All items completed"
                        }
                    },
                    "task": {
                        "name": "install system-level components"
                    }
                }
            ]
        }
    ]
}

желаемый вывод:

{
  "name": "debug inventory_hostname",
  "msg": "inventory_hostname:192.169.1.70:"
},
{
  "name": "install system-level components",
  "msg": "All items completed"
}

Я могу извлечь некоторые данные, но не могу вложить MSG-сообщение узла-брата и не могу ограничить свой поиск только интересующим меня хостом, 192.169.1.70:

jq '.plays[] | .tasks[] | .task,.hosts' ansible.json

{
  "name": "debug inventory_hostname"
}
{
  "192.169.1.70": {
    "msg": "inventory_hostname:192.169.1.70:"
  },
  "dontcare": {
    "msg": "dont want to see this:"
  }
}
{
  "name": "install system-level components"
}
{
  "192.169.1.70": {
    "msg": "All items completed"
  }
}

Всякий раз, когда я пытаюсь что-то квалифицировать для ключа хоста, который я хочу, .hosts["192.169.1.170"] или .hosts.192.169.1.170 или .hosts{"192.169.1.170"}, .hosts("192.169.1.170"), я получаю либо null или ошибки компиляции. Большая часть примера jq-кода касается фильтрации массивов, а не доступа к хэш-картам / словарям.

И как бы я взял данные родственного брата для имени и ввел бы тот же объект, что и выше?

1 Ответ

2 голосов
/ 10 марта 2020

Я думаю, вы ищете select и оператор сложения (+).

.plays[].tasks[]
| select(.hosts | has("192.169.1.70"))
| .task + .hosts."192.169.1.70"

REPL demo

...