使用jq按对象名称过滤JSON

时间:2019-04-09 00:36:43

标签: json jq

我无法使用jq按键进行过滤。

# /home/test/show_param_db.sh -p memory -h host00* -f json | jq '.[]'

> [   {
>     "host001": {
>       "status": "OK",
>       "msg": "",
>       "data": [
>         {
>           "hi_shared_memory_address": "0"
>         },
>         {
>           "memory_max_target": "1G"
>         },
>         {
>           "memory_target": "1G"
>         },
>         {
>           "shared_memory_address": "0"
>         }
>       ]
>     },
>     "host002": {
>       "status": "ERROR",
>       "msg": "su: user oracle does not exist",
>       "data": []
>     }   } ]

当我尝试按键过滤时:

# /home/test/show_param_db.sh -p memory -h host00* -f json | jq -r '.["host001"]'

==>空

甚至列出密钥:

# /home/test/show_param_db.sh -p memory -h host00* -f json | jq -r '.[]' |  jq -r 'keys'

[   0 ]

我希望通过主机名获取json。感谢所有建议。

1 个答案:

答案 0 :(得分:0)

您是否只是在寻找与host001相对应的对象?您可以使用to_entriesfrom_entries在键/值对和JSON对象之间进行映射,并在两者之间使用select()表达式来匹配所需的主机

jq '.[][] | to_entries | map(select(.key=="host001")) | from_entries'

要使其具有动态性,请将名称作为单独的arg传递

jq --arg host "host001" '.[][] | to_entries | map(select(.key==$host)) | from_entries'