使用shell迭代json

时间:2015-11-10 04:33:38

标签: linux bash shell ubuntu jq

我有以下格式的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

我正在计算并正确命名,但无法获取版本信息。我怎么才能得到它。我是脚本的新手,在这方面的任何帮助都非常感谢。谢谢你。

2 个答案:

答案 0 :(得分:3)

首先你的JSON示例似乎有点格式错误 - push_psservice行后面有一个逗号,但这很可能是一个错字。

您可能会发现使用jq的to_entries(请参阅https://stackoverflow.com/a/24254365/4513656)将对象的字段转换为数组更容易,例如:

to_entries | .[0].key
to_entries | .[0].value.version

https://jqplay.org/上试试。

答案 1 :(得分:1)

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