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
no를 인쇄하세요 newline
.
<your command> | awk 'NR > 1 { printf(",") } {printf "%s",$0}'