2017-01-31 36 views
0

我正在编写一个脚本,它将解析JSON文件并提取出一些docker容器名称以及它们正在运行的服务器。然后我需要用我得到的信息在bash中做一些其他的事情。我是新使用jq,但这是我迄今为止所得到的。使用jq解析if-then-else问题

我运行以下命令:

cat env.json | jq '[.env.service.config | .[] | {dockerContainerName:.dockerConfig.dockerImageName,servers:[.allocation[].serverName]}]' 

这让我的输出:

[ 
    { 
    "dockerContainerName": null, 
    "servers": [] 
    }, 
    { 
    "dockerContainerName": "my_awesome_container", 
    "servers": [ 
     "serverX01", 
     "serverX02" 
    ] 
    }, 
... 
... 
] 

你可以从结果一些服务CONFIGS的看到没有dockerConfig.dockerImageName。我需要限制返回的内容以滤除那些没有dockerConfig的。我曾尝试使用if-then-else,但似乎无法使其正常工作。

有什么想法吗?

+1

你能提供完整的'JSON'?并提供你需要的确切的输出?目前的信息不足。 – Inian

回答

1

您可以使用select限制阵列的对象,其dockerContainerName内容不同于null

jq '.[] | select(.dockerContainerName != null)' <<EOF 
[ 
    { 
    "dockerContainerName": null, 
    "servers": [] 
    }, 
    { 
    "dockerContainerName": "my_awesome_container", 
    "servers": [ 
     "serverX01", 
     "serverX02" 
    ] 
    } 
] 
EOF 

{ 
    "dockerContainerName": "my_awesome_container", 
    "servers": [ 
    "serverX01", 
    "serverX02" 
    ] 
} 
+0

谢谢!我能够将我的jq命令修改为以下内容,并使用您建议的选项将其过滤掉! 'cat env.json | jq'[.env.service.config | 。[] | {dockerContainerName:.dockerConfig.dockerImageName,servers:[。allocation []。serverName]} |选择(.dockerContainerName!= null)]'' – pricecreations

+0

@pricecreations不错,但我认为你可以在创建自己的项目之前选择配置:'jq'[.env.service.config [] |选择(.dockerConfig.dockerImageName!= null)| {dockerContainerName:.dockerConfig.dockerImageName,servers:[.allocation []。server Name]}]' – Aaron

+0

Good call!这也有效并改善了性能。 – pricecreations