Я пытаюсь получить curl
URL-адрес, который возвращает файл JSON, а затем хочу извлечь из него хосты и создать строку, разделенную запятыми.
У меня первая часть работает
curl -s -u "admin:admin" -H "X-Requested-By: ambari" "https://hbasecluster.net/api/v1/clusters/mycluster/services/ZOOKEEPER/components/ZOOKEEPER_SERVER" | jq -r '.host_components[].HostRoles.host_name'
который возвращает
zk0-mycluster.net
zk1-mycluster.net
zk2-mycluster.net
Теперь я хочу объединить их в одну строку, например
zk0-mycluster.net,zk1-mycluster.net,zk2-mycluster.net
решение1
Сделайте это в jq
, но посмотрите@Kusalananda's ответ первый
jq -r '.host_components[].HostRoles.host_name | join(",")'
Нет, это неправильно. Вот что вам нужно:
jq -r '.host_components | map(.HostRoles.host_name) | join(",")'
Демонстрация:
jq -r '.host_components | map(.HostRoles.host_name) | join(",")' <<DATA
{"host_components":[
{"HostRoles":{"host_name":"one"}},
{"HostRoles":{"host_name":"two"}},
{"HostRoles":{"host_name":"three"}}
]}
DATA
выходы
one,two,three
решение2
paste
Лучший инструмент для выполнения этой работы:
your_command | paste -sd, -
решение3
Если вам нужен вывод в формате CSV из вашего документа JSON, то вы можете использовать оператор @csv
в jq
.
somecommand | jq -r '[ .host_components[].HostRoles.host_name ] | @csv'
Это использует то же выражение, которое вы используете в вопросе, чтобы вытащить нужные вам данные, но оно помещает все имена хостов в массив. Затем массив передается, @csv
что гарантирует, что данные правильно заключены в кавычки для вывода CSV.
Вы ожидаете получить следующий результат:
"zk0-mycluster.net","zk1-mycluster.net","zk2-mycluster.net"
Любые запятые, двойные кавычки или символы новой строки, встроенные в значения, будут правильно заключены в кавычки, как и ожидается в файле в формате CSV.
решение4
Если вы хотите использовать awk
, просто напечатайте без newline
:
<your command> | awk 'NR > 1 { printf(",") } {printf "%s",$0}'