【问题标题】:Filtering JSON by object name using jq使用 jq 按对象名称过滤 JSON
【发布时间】:2019-04-09 00:36:42
【问题描述】:

我无法使用 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。感谢所有建议。

【问题讨论】:

标签: json jq


【解决方案1】:

您是否只想获取与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'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    • 2016-03-02
    相关资源
    最近更新 更多