... | jq -r '.rows[] |.[] | [.name,.["cpu.total"],.["memory.total"]] | map(tostring) | join(",")'
Это:
- Расширяет массив в
.rows
в выходной поток (.rows.[]
).- Трубы, ведущие к следующему шагу(
|
).- Разворачивает переданный объект в (в данном случае )единственное значение, которое он содержит(
.[]
).- Создает массив с результатами
.name
,.["cpu.total"]
и.["memory.total"]
, каждый из которых оценивается для этого объекта(.[.name,... ]
).- Преобразует все значения этого массива в строки(
map(tostring)
).- Соединяет элементы каждого массива запятой(
join(",")
).
jq -r
выводит необработанные данные , а не заключает их в кавычки и экранирует. Результатом будет:foo-01,12,16267368kB foo-02,12,16264296kB
как вы хотели. В зависимости от вашего парсера CSV и реальных данных,вам могут понадобиться дополнительные кавычки вокруг строк, которые вы можете добавить в или использовать
@csv
вместо последних двух шагов.... | jq -r '.rows[] |.[] | [.name,.["cpu.total"],.["memory.total"]] | @csv'
Мы могли бы пропустить
map
, преобразовав только одно значение внутри, что требует дополнительных скобок:... | jq -r '.rows[]|.[]|[.name, (.["cpu.total"] | tostring),.["memory.total"]] | join(",")'
И, наверное, самая уродливая альтернатива:
... | jq -r '.rows[]|to_entries|.[]|.key + "," + (.value["cpu.total"] | tostring) + "," +.value["memory.total"]'
В этом случае мы не полагаемся на поле
.name
и строим всю строку вручную. Если вам нужен очень индивидуальный формат, это самый гибкий вариант.
Поскольку брокер kafka будет перенаправлять потребителя на использование исходных хостов. Смотрите это,https://stackoverflow.com/questions/45854168/consume-from-a-kafka-cluster-through-ssh-tunnel