JSON使用jq if-then-else问题进行解析

时间:2017-01-31 14:39:00

标签: json bash jq

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

我运行以下内容:

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

这给了我一个输出:

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

从结果中可以看出,一些服务配置没有dockerConfig.dockerImageName。我需要限制回来过滤掉没有dockerConfig的东西。我尝试过使用if-then-else但似乎无法让它正常工作。

有任何想法吗?

1 个答案:

答案 0 :(得分:1)

您可以使用select将数组内容限制为dockerContainerNamenull不同的对象:

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

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