업데이트(시작): 다음 줄에 답하면 전체 질문에 답하게 됩니다.
왜 다음과 같은 상황이 발생합니까?
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
.