使用 shell 迭代 json
Iterate over a json using shell
我有一个 json 格式如下。我想遍历这个 json 文件
{
"atest_engine": { "version": "96" },
"a_kdfvm": { "version": "68" },
"aseft_api": { "version": "" },
"push_psservice": { "version": "68" },
}
我尝试了 jq 实用程序,我的脚本如下。
count=$( jq '. | length' test.json )
echo $count
for((i=0;i<$count;i++))
do
name=$(cat test.json | jq '.|keys['${i}']')
version=$(cat test.json | jq '.|keys['${i}'].version')
echo $name
echo $version
done
我正在正确获取计数和名称,但无法获取版本信息。我怎么才能得到它。我是脚本编写的新手,在这方面的任何帮助都非常重要 appreciated.Thanks 提前。
首先,您的 JSON 示例似乎有点格式错误 - push_psservice 行后面有一个逗号,但这很可能是错字。
您可能会发现使用 jq 的 to_entries(参见 )将对象的字段转换为数组更容易,例如:
to_entries | .[0].key
to_entries | .[0].value.version
在 https://jqplay.org/ 上试试这个。
input.json
{
"atest_engine": { "version": "96" },
"a_kdfvm": { "version": "68" },
"aseft_api": { "version": "" },
"push_psservice": { "version": "68" }
}
命令
jq -r 'to_entries[] | "\(.key)\t\(.value.version)"' input.json |
while read name version
do
echo "name:" $name
echo "version:" $version
done
结果
name: atest_engine
version: 96
name: a_kdfvm
version: 68
name: aseft_api
version:
name: push_psservice
version: 68
我有一个 json 格式如下。我想遍历这个 json 文件
{
"atest_engine": { "version": "96" },
"a_kdfvm": { "version": "68" },
"aseft_api": { "version": "" },
"push_psservice": { "version": "68" },
}
我尝试了 jq 实用程序,我的脚本如下。
count=$( jq '. | length' test.json )
echo $count
for((i=0;i<$count;i++))
do
name=$(cat test.json | jq '.|keys['${i}']')
version=$(cat test.json | jq '.|keys['${i}'].version')
echo $name
echo $version
done
我正在正确获取计数和名称,但无法获取版本信息。我怎么才能得到它。我是脚本编写的新手,在这方面的任何帮助都非常重要 appreciated.Thanks 提前。
首先,您的 JSON 示例似乎有点格式错误 - push_psservice 行后面有一个逗号,但这很可能是错字。
您可能会发现使用 jq 的 to_entries(参见 )将对象的字段转换为数组更容易,例如:
to_entries | .[0].key
to_entries | .[0].value.version
在 https://jqplay.org/ 上试试这个。
input.json
{
"atest_engine": { "version": "96" },
"a_kdfvm": { "version": "68" },
"aseft_api": { "version": "" },
"push_psservice": { "version": "68" }
}
命令
jq -r 'to_entries[] | "\(.key)\t\(.value.version)"' input.json |
while read name version
do
echo "name:" $name
echo "version:" $version
done
结果
name: atest_engine
version: 96
name: a_kdfvm
version: 68
name: aseft_api
version:
name: push_psservice
version: 68