如何用jq解析JSON中rgw.main下的num_objects字段?
如何用jq提取JSON中"rgw.main"下的num_objects值?
给定如下JSON数据:
{ "bucket": "mybucket", "num_shards": 11, "tenant": "", "zonegroup": "xxx-11111", "placement_rule": "default-placement", "explicit_placement": { "data_pool": "", "data_extra_pool": "", "index_pool": "" }, "id": "234324324", "marker": "234324324.2", "index_type": "Normal", "owner": "store", "ver": "0#1196975824,1#1195439377,2#1195232380,3#1194062417,4#1195521322,5#1195488056,6#1193225866,7#1195484409,8#1195542434,9#1195529602,10#1195327401", "master_ver": "0#0,1#0,2#0,3#0,4#0,5#0,6#0,7#0,8#0,9#0,10#0", "mtime": "2022-02-18T11:16:22.620065Z", "creation_time": "2021-03-12T10:02:54.033355Z", "max_marker": "0#01196975823.2645569872.5,1#01195439376.3395178223.5,2#01195232379.3168551901.5,3#01194062416.2633030768.5,4#01195521321.2647348717.5,5#01195488055.3126383883.5,6#01193225865.2630243615.5,7#01195484408.2645677558.5,8#01195542433.2655116258.5,9#01195529601.2621773307.5,10#01195327400.2629607598.5", "usage": { "rgw.none": { "size": 0, "size_actual": 0, "size_utilized": 0, "size_kb": 0, "size_kb_actual": 0, "size_kb_utilized": 0, "num_objects": 230 }, "rgw.main": { "size": 120124562767, "size_actual": 120220463104, "size_utilized": 120124562767, "size_kb": 117309144, "size_kb_actual": 117402796, "size_kb_utilized": 117309144, "num_objects": 29670 }, "rgw.multimeta": { "size": 0, "size_actual": 0, "size_utilized": 7776, "size_kb": 0, "size_kb_actual": 0, "size_kb_utilized": 8, "num_objects": 288 } }, "bucket_quota": { "enabled": false, "check_on_raw": false, "max_size": -1, "max_size_kb": 0, "max_objects": -1 } }
尝试了以下jq表达式均未得到预期结果:
.usage[].num_objects:返回3个数值.usage[].rgw.main.num_objects:返回null.usage[].rgw:返回null
问题根源
你误解了jq中对象遍历的语法,以及带特殊字符键名的访问规则:
.usage[]是遍历usage下的所有直接子对象(即rgw.none、rgw.main、rgw.multimeta),所以.usage[].num_objects会取出这三个对象各自的num_objects值。rgw.main本身是usage的一个直接键名,不是某个子对象下rgw属性里的main子属性。你写的.usage[].rgw.main是在遍历每个子对象后,试图查找子对象里的rgw属性,但这些子对象根本没有rgw键,所以返回null。
正确的jq表达式
因为键名包含小数点,不能直接用.链式访问(会被解析成嵌套结构),可以用以下两种方式之一:
- 用引号包裹键名:
.usage."rgw.main".num_objects - 用方括号包裹键名:
.usage["rgw.main"].num_objects
执行任意一个表达式,都会返回目标值:29670
内容的提问来源于stack exchange,提问作者Badb0y
相关产品推荐
相关产品推荐

