json 파일을 반환하는 일부 URL을 시도 중입니다 curl
. 그런 다음 해당 파일에서 호스트를 구문 분석하고 쉼표로 구분된 문자열을 만들고 싶습니다.
첫 번째 부분이 작동 중입니다.
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의 답변 첫 번째
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
원하는 것이 JSON 문서의 CSV 형식 출력인 @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}'