jq를 사용하여 json에서 스크립트 목록 가져오기

jq를 사용하여 json에서 스크립트 목록 가져오기

업데이트(시작): 다음 줄에 답하면 전체 질문에 답하게 됩니다.

왜 다음과 같은 상황이 발생합니까?

echo '{"ipv4":["192.168.64.193"]}'|jq .ipv4[0]

이 오류가 발생합니다.

no matches found: .ipv4[0]

업데이트(완료)

이 json에서 "ipv4" 값을 포함하는 목록 변수를 만들려고 합니다.

{
    "list": [
        {
            "ipv4": [
                "192.168.64.193"
            ],
            "name": "node2",
            "release": "20.04 LTS",
            "state": "Running"
        },
        {
            "ipv4": [
                "192.168.64.192"
            ],
            "name": "node1",
            "release": "20.04 LTS",
            "state": "Running"
        }
    ]
}

HOSTS는 IP 주소 목록입니다.

업데이트: @Kusalananda 덕분에 스크립트에 이것을 사용했습니다.HOSTS+=$(echo $i|jq '.ipv4[0]')

get_hosts(){
  unset HOSTS
  # unset NAMES
  jq -c '.list[]' file.json | while read i; do
      HOSTS+=$(echo $i | jq .ipv4)
      # NAMES+=$(echo $i | jq .name)
  done
  echo $HOSTS
  # echo $HOSTS
}

나는 얻다:

[
  "192.168.64.193"
][
  "192.168.64.192"
]

하지만 나는 다음이 필요합니다:

  "192.168.64.193"
  "192.168.64.192"

그래서 나는 다음을 시도한다:

...
HOSTS+=$(echo $i | jq .ipv4[0])
...

하지만 나는 다음과 같은 결과를 얻습니다.

get_hosts:3: no matches found: .ipv4[0]
get_hosts:3: no matches found: .ipv4[0]

참고: 다음은 루프의 줄 중 하나입니다.

{"ipv4":["192.168.64.193"],"name":"node2","release":"20.04 LTS","state":"Running"}

답변1

따옴표가 없는 문자열은 .ipv4[]쉘 와일드카드 패턴입니다. 이 패턴은 기존 파일과 일치하지 않으며, 사용 중인 셸은 zsh패턴을 확장하지 않은 채로 두는 대신(기본적으로) 오류를 생성하도록 구성됩니다( bash기본적으로).

따옴표와 함께 사용되는 표현 jq:

echo '{"ipv4":["192.168.64.193"]}' | jq '.ipv4[0]'

질문에 제공한 데이터에서 모든 IP 주소를 추출하려면 ipv4모든 배열 배열의 모든 요소를 ​​가져옵니다 list.

$ jq -r '.list[].ipv4[]' file
192.168.64.193
192.168.64.192

이러한 값을 배열에 넣을 필요는 거의 없습니다. 대신, 하나씩 읽고 필요한 작업을 수행하십시오.

jq -r '.list[].ipv4[]' file |
while IFS= read -r ipaddr; do
    # use "$ipaddr" here
done

각 이름의 이름과 첫 번째 IP 주소를 읽으려면 다음을 수행하십시오.

jq -r '.list[] | [ .name, .ipv4[0] ] | @tsv' file |
while IFS=$'\t' read -r name ipaddr; do
    # use "$name" and "$ipaddr" here
done

@tsv연산자는 탭으로 구분된 배열 출력을 생성하며, 여기서는 배열의 각 항목 이름을 해당 IP 주소와 쌍으로 연결하는 데 사용합니다 list.

관련 정보