jq 출력을 쉼표로 구분된 문자열로 연결

jq 출력을 쉼표로 구분된 문자열로 연결

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'

이는 필요한 데이터를 추출하기 위해 질문에 사용된 것과 동일한 표현식을 사용하지만 모든 호스트 이름을 배열에 넣습니다. 그런 다음 이 배열은 @csvCSV 출력에서 ​​데이터가 올바르게 참조되는지 확인하기 위해 전달됩니다.

다음과 같은 결과가 나올 것으로 예상됩니다.

"zk0-mycluster.net","zk1-mycluster.net","zk2-mycluster.net"

값에 포함된 모든 쉼표, 큰따옴표 또는 줄 바꿈은 CSV 형식 파일에서 예상대로 올바르게 인용됩니다.

답변4

를 사용하려면 awkno를 인쇄하세요 newline.

    <your command> | awk 'NR > 1 { printf(",") } {printf "%s",$0}'

관련 정보