JQ - Добавить json данных до и после - PullRequest
2 голосов
/ 30 апреля 2020

Я хочу добавить некоторые ключи и значения и объект перед выводом jq, а затем в конце добавить auth и ID. Как я могу это сделать?

Для случая 1 - в начале я хочу добавить это

{
    "jsonrpc": "2.0",
    "method": "host.get",
    "params":
        "filter": {

, а в конце следующее.

},
    "auth": "038e1d7b1735c6a5436ee9eae095879e",
    "id": 1
}

Любой предложения?

Случай 1:

echo $hosts
host001 host002 host003

echo $hosts | jq -R 'split (" ")' | jq -s '{hosts:map({"hostid":.})}'
{
  "hosts": [
    {
      "hostid": [
        "host001",
        "host002",
        "host003"
      ]
    }
  ]
}

Но я хочу вывести как этот, который включает в себя jsonrp c, методы, параметры, фильтр, а затем необходимо добавить массив хоста и в конце добавьте auth и id.

Ожидаемый запрос 1:

{
    "jsonrpc": "2.0",
    "method": "host.get",
    "params": {
        "filter": {
            "hostid": [
                "host001",
                "host002",
                "host003"
            ]
        }
    },
    "auth": "038e1d7b1735c6a5436ee9eae095879e",
    "id": 1
}

Случай 2:

Я хочу добавить jsonrp c, методы params et c, но также добавьте $hostid_json после $groupid_json, а затем добавьте auth, id et c., как показано в запросе 2.

echo $group_id
92 93

groupid_json=$(echo $group_id | jq -R 'split (" ")'  | jq '.[]'  | jq -s '{groups:map({"groupid":.})}')
{ "groups": [ { "groupid": "92" }, { "groupid": "93" } ] }

echo $hosts_id
1111 2222

hostid_json=$(echo $hosts_id | jq -R 'split (" ")'  | jq '.[]'  | jq -s '{hosts:map({"hostid":.})}')
{ "hosts": [ { "hostid": "1111" }, { "hostid": "2222" } ] }

Но окончательный вывод, который мне нужен, похож на следующий.

Ожидаемый запрос 2:

{
    "jsonrpc": "2.0",
    "method": "hostgroup.massadd",
    "params": {
        "groups": [
            {
                "groupid": "92"
            },
            {
                "groupid": "93"
            }
        ],
        "hosts": [
            {
                "hostid": "1111"
            },
            {
                "hostid": "2222"
            }
        ]
    },
    "auth": "f223adf833b2bf2ff38574a67bba6372",
    "id": 1
}

1 Ответ

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

Вам не нужно использовать необработанный режим ввода в любом из вышеперечисленных случаев, просто используйте флаг --argjson, чтобы включить массив непосредственно в фильтр. Таким образом, ваш первый случай просто становится

jq -n --argjson hosts '["host001", "host002", "host003"]' \
       '{ 
           jsonrpc: "2.0", 
           method: "host.get", 
           params: {filter: {"hostid": $hosts}}, 
           auth: "038e1d7b1735c6a5436ee9eae095879e", 
           id: 1  
        }'

, а второй случай становится

jq -n --argjson group_id '["92", "93"]' --argjson hosts_id '["1111", "2222"]' \
       '{ 
           jsonrpc: "2.0", 
           method: "hostgroup.massadd", 
           params: { 
             groups: (reduce $group_id[] as $g (.; . + [{ group_id: $g }])), 
             hosts:  (reduce $hosts_id[] as $h (.; . + [{ hostid: $h }])) 
           }, 
           auth: "038e1d7b1735c6a5436ee9eae095879e", 
           id: 1  
        }'

. -n предназначен для нулевого режима ввода, используемого при построении JSON с нуля, то есть для запуска фильтр без необходимости каких-либо входных файлов. Функция reduce() выполняется итеративно для каждого входного объекта, а . + [{ group_id: $g }] создает объект JSON для каждого созданного значения group_id.

Using dynamic values in argument fields

Если вы не хотите жестко кодировать значения в arg json и хотите сделать его динамически настраиваемым из переменной, используйте заполнитель, такой как массив, для хранения нескольких значений

Case: 1

hosts=(host001 host002 host003)

jq -n --arg hosts_arg "${hosts[*]}" \
       '{
           jsonrpc: "2.0",
           method: "host.get",
           params: {filter: {"hostid": ($hosts_arg | split(" "))}},
           auth: "038e1d7b1735c6a5436ee9eae095879e",
           id: 1
        }'

Случай 2:

groupid=(92 93)
hostid=(1111 2222)

jq -n --arg group_id "${groupid[*]}" --arg hosts_id "${hostid[*]}" \
       '{
           jsonrpc: "2.0",
           method: "hostgroup.massadd",
           params: {
           groups: (reduce ($group_id | split(" ")[]) as $g (.; . + [{ group_id: $g }])),
           hosts:  (reduce ($hosts_id | split(" ")[]) as $h (.; . + [{ hostid: $h }]))
           },
           auth: "038e1d7b1735c6a5436ee9eae095879e",
           id: 1
        }'

Обратите внимание, что этот подход не работает, если ваш group_id или host_id содержит строки с пробелами.

...