Распечатать ключ и значение для разных записей в объекте - PullRequest
0 голосов
/ 16 июня 2020

Мне нужно напечатать некоторые результаты с помощью jq, чтобы взять json. Это пример:

{
  "data": [
    {
      "time": 20201606,
      "event": {
        "ip": "127.0.1",
        "hostname": "srv1",
        "locations": [
          "UK",
          "site1"
        ],
        "num": 1
      }
    },
    {
      "time": 202016034,
      "event": {
        "ip": "127.0.2",
        "hostname": "srv2",
        "locations": [
          "UK",
          "site2"
        ],
        "num": 3
      }
    }
  ]
}

Как для генерации этого вывода «num, ip, hostname, locations»:

1, srv1, 127.0.1, UK,site1
2, srv2, 127.0.2, HK,site2
3, srv3, 127.0.3, LO,site3

Как я могу распечатать это через jq?

Ответы [ 2 ]

3 голосов
/ 16 июня 2020

Соединяйте местоположения через запятую и помещайте результат в массив с другими полями. Затем снова соедините запятую, а затем пробел, чтобы получить желаемый формат вывода. Например:

.data[].event | [
  .num,
  .hostname,
  .ip,
 (.locations | join(",")) ?
] | join(", ")

Используйте параметр --raw-output / -r в вызове командной строки, чтобы получить необработанные строки вместо JSON строк.

Онлайн-демонстрация

1 голос
/ 16 июня 2020

По сути, вы хотите создать массив, состоящий из нужных вам значений:

$ jq '.data[].event | [.num, .hostame, .ip, .locations]' tmp.json
[
  1,
  null,
  "127.0.1",
  [
    "UK",
    "site1"
  ]
]
[
  3,
  null,
  "127.0.2",
  [
    "UK",
    "site2"
  ]
]

Оттуда это вопрос форматирования. Сначала давайте превратим список местоположений в одну строку:

$ jq '.data[].event | [.num, .hostame, .ip, <b>(.locations|join(","))</b>]' tmp.json
[
  1,
  null,
  "127.0.1",
  "UK,site1"
]
[
  3,
  null,
  "127.0.2",
  "UK,site2"
]

Затем давайте объединим эти строки в строку, разделенную ", ".

$ jq '.data[].event | [.num, .hostame, .ip, (.locations|join(","))]<b> | join(", ")</b>' tmp.json
"1, , 127.0.1, UK,site1"
"3, , 127.0.2, UK,site2"

Наконец, вы можете использовать флаг -r для вывода необработанного текста, а не строковое значение JSON.

$ jq <b>-r</b> '.data[].event | [.num, .hostame, .ip, (.locations|join(","))] | join(", ")' tmp.json
1, , 127.0.1, UK,site1
3, , 127.0.2, UK,site2
...