【发布时间】:2019-08-28 15:49:35
【问题描述】:
我有一个如下所示的 json 变量:
{
"status": "closed",
"host": "host1-availabe_zone_A"
}
{
"status": "closed",
"host": "host2-availabe_zone_B"
}
{
"status": "closed",
"host": "host3-availabe_zone_A"
}
我正在尝试将其转换为类似哈希的数据结构(zsh/bash 中的关联数组)以获取每个可用区域中的主机数。首选结果将是基于上述数据的结果:
availabe_zone_A -> 2
availabe_zone_B -> 1
我在尝试迭代 json 变量时遇到了一些问题。
declare -A az_to_number_of_open_hosts
for host in $(jq . <<< $hosts_list)
do
az=$(rev <<< $(echo $host | jq .host) | cut -d. -f3 | rev)
((az_to_number_of_open_hosts[$az]++))
done
提取可用区域的行是因为主机格式始终为blabla123213.az.domain.com。
该代码不起作用,因为变量 host 似乎是指每行 json 字符串而不是 json 条目。有没有推荐的方法来迭代每个 json 条目?
【问题讨论】:
-
这不是有效的 JSON。如果您有多个对象,则它们必须包含在一个数组中,以便您可以循环遍历它。
-
您希望
jq .做什么?它只是将输入作为输出返回。 -
为什么声明
az_to_number_of_open_hosts而不使用它? -
@Barmar 这不是一个有效的 json 吗?因为 jq 与上面的条目配合得很好:
jq .host /tmp/test.json "host1-availabe_zone_A" "host2-availabe_zone_B" "host3-availabe_zone_A" -
jq可以遍历单独的 JSON 值的流,这就是你所拥有的。