Как выбрать несколько параметров из JSON выходных данных, которые удовлетворяют условию и далее выбрать индивидуальное значение - PullRequest
0 голосов
/ 04 мая 2020

У меня есть json выход, из которого мне нужно получить значение id и значение IPv4_address, где существует IPv4_address (это не должно быть нулевым). Необходимо использовать это значение идентификатора для другого запроса вместе со случайно сгенерированной строкой.

Вот разбивка требования:

ШАГ 1: В следующем примере для ipv4_address: 1.1.1.1 & ipv4_address: 1.1.1.2 мне нужно получить вывод id, который это "4e-0365-4e29-95ca-329165eecf8a" и "c9061b6674a8546cea" вместе с IP-адресом.

Пример моего вывода должен выглядеть (что-то похожее):

1.1.1.1 4e-0365-4e29-95ca-329165eecf8a
1.1.1.2 c9061b6674a8546cea

Я пытался использовать jq, но с этим я не могу получить оба значения:

ID="$(echo "$test" \n | jq -r '.USER[] | select(.ipv4_address) | .ipv4_address')"
ID1="$(echo "$test" \n | jq -r '.USER[] | select(.ipv4_address) | .id')"

Пример выходных данных, отображаемых с помощью двух вышеуказанных команд: Значение идентификатора: 1.1.1.1 1.1.1.2 Значение ID1: 4e-0365-4e29-95ca-329165eecf8a c9061b6674a8546cea

ШАГ 2 : Создание профиля: мне нужно использовать каждое значение $ ID1 в другом запросе вместе со случайно сгенерированной строкой. Случайная строка генерируется в соответствии с количеством $ ID1 (поэтому здесь я сгенерирую 2 случайные строки) И, таким образом, создаются 2 профиля. Ques: Как я могу получить каждый идентификатор из переменной $ ID1? Я пробовал что-то вроде ID1 [0], но это, кажется, неправильно

ШАГ 3: будет использовать каждый идентификатор и случайную строку для другого запроса, как только он будет выполнен или если этот шаг не пройден, мне нужно предоставить вывод к файлу и вывод должен выглядеть так: Мое требование для окончательного вывода:

1.1.1.1 4e-0365-4e29-95ca-329165eecf8a  <randomvalue-1> <profile-1> DONE
1.1.1.2 c9061b6674a8546cea <randomvalue-2> <profile-2> FAILED

, где случайное значение будет сгенерировано случайным образом и должно использоваться против идентификатора.

JSON вывод, который нужно проанализировать:

{
  "errorcode": 0,
  "message": "Done",
  "operation": "get",
  "resourceType": "USER",
  "username": "root",
  "tenant_name": "Owner",
  "tenant_id": "05db6674ad458546cd2",
  "resourceName": "",
  "USER": [
    {
      "is_default": "false",
      "session_timeout": "0",
      "permission": "root",
      "name": "ee",
      "session_timeout_unit": "",
      "tenant_id": "55bcb6674ad45854",
      "id": "4e-0365-4e29-95ca-329165eecf8a",
      "ipv4_address": "1.1.1.1",
      "state": "Up",
      "tenant_name": "Owner",
      "encrypted": "false",
      "groups": [
        "owner"
      ],
      "root_user": ""
    },
    {
      "is_default": "false",
      "session_timeout": "0",
      "permission": "read",
      "name": "test",
      "session_timeout_unit": "",
      "tenant_id": "bc906674ad458546cd2",
      "id": "12cd0-fb7f-4abf-b060-48e98b794b06",
      "tenant_name": "Owner",
      "encrypted": "false",
      "groups": [
        "read"
      ],
      "root_user": ""
    },
    {
      "is_default": "true",
      "session_timeout": "0",
      "permission": "root",
      "name": "root",
      "session_timeout_unit": "",     
      "tenant_id": "c905db6d458546cd2",
      "id": "c9061b6674a8546cea",
      "ipv4_address": "1.1.1.2",
      "state": "Not Reachable",
      "tenant_name": "Owner",
      "encrypted": "false",
      "groups": [
        "owner"
      ],
      "root_user": ""
    },
    {
      "is_default": "false",
      "session_timeout": "0",
      "permission": "readonly",
      "name": "a",
      "session_timeout_unit": "",
      "tenant_id": "c905674ad458546cd2",
      "id": "bc8a-4fd6-bc09-8c39c131b54e",
      "tenant_name": "Owner",
      "encrypted": "false",
      "groups": [
        "read"
      ],
      "root_user": ""
    }
  ]
}

1 Ответ

1 голос
/ 04 мая 2020

Не совсем ясно с логикой c маркировки: «СДЕЛАНО» и «СБОЙ». Но чтобы ответить на ваш первый вопрос, в котором вы хотите выбрать несколько полей, вы можете сделать что-то вроде этого:

$ cat input.js | jq -r '.USER[] | select(.ipv4_address) | "\(.ipv4_address) \(.id)"' > result.js

Это выведет результат в файл с именем result. js. Вы можете применить к этому файлу свой собственный логик c с маркировкой DONE и Failed.

В приведенной выше команде, когда вы делаете select (.ipv4_address) Он в основном отбрасывает все записи, для которых Значение ipv4_address равно нулю или его нет. если вы хотите выбрать записи, для которых ipv4_address имеет значение NULL, тогда оператор select будет выглядеть примерно так:

select(.ipv4_address == null)
...