jq:根据if键以指定字符串结尾的过滤输入

时间:2018-02-21 11:09:38

标签: json filter key jq

我得到了这个JSON数据,我需要提取类型列表:

{
  "token/": {
    "accessor": "auth_token_909d6a81",
    "config": {
      "default_lease_ttl": 0,
      "max_lease_ttl": 0
    },
    "description": "token based credentials",
    "local": false,
    "seal_wrap": false,
    "type": "token"           <-- I need to extract this value ...
  },
  "userpass/": {
    "similar_to": {
      "above": null
    },
    "description": "",
    "local": false,
    "seal_wrap": false,
    "type": "userpass"        <-- ... and this one
  },
  "request_id": "f2a4c135-f699-f29d-ca7c-3320dce0a550",
  "more_keys": "more_values",
  "data": {
    "more_data": {
      "even_more_data": "snipped"
    }
  },
  "you_get_the": "idea"
}

很抱歉,在复制时,内联评论会弄乱数据。粘贴,但这似乎是澄清我的目标的最佳方式: 对于以/结尾的所有根密钥,我需要.type的值,因此上述示例的最终结果为token userpass

我设法为根密钥创建了一个工作过滤器:

host:~ user$ jq -r '. | keys[] | endswith("/")' <<< "${json_data}"
false
false
false
true
true
false

我可以使用该过滤器来获取所需的键,但这只是键,而不是它们下面的整个数据结构:

host:~ user$ jq -r '. | keys[] | select(. | endswith("/"))' <<< "${json_data}"
token/
userpass/

我似乎无法把这一切都放在一起......

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:5)

jq 解决方案:

jq -r '. as $o | keys_unsorted[] | select(endswith("/")) | $o[.].type' file.json

输出:

token
userpass

答案 1 :(得分:3)

to_entries值得了解,尤其是因为它经常导致易于阅读(无变量)的管道,如下所示:

to_entries[] | select(.key|endswith("/")) | .value.type