Shell-Script

使用 jq 從 json 獲取腳本列表

  • July 27, 2022

更新(開始):回答以下行,您已經回答了完整的問題:

為什麼會出現以下情況:

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"}

未加引號的字元串.ipv4[]是 shell globbing 模式。此模式與任何現有文件都不匹配,並且您使用的 shell 被配置為生成錯誤(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

引用自:https://unix.stackexchange.com/questions/711445