如何使用jq筛选嵌套字典中第n个RespStatus匹配的条目
按records中第n个RespStatus筛选JSON条目
问题背景
现有行分隔的JSON日志数据,需要筛选出records数组中第n个RespStatus标签值为指定内容(如304)的条目,而非包含任意符合条件的RespStatus的条目。示例数据如下:
[ { "id": 671731542, "type": "BeReq", "records": [ { "tag": "foo", "value": "bar" }, { "tag": "foo", "value": "bar" }, { "tag": "RespStatus", "value": "200" }, { "tag": "RespReason", "value": "OK" }, { "tag": "foo", "value": "bar" }, { "tag": "RespStatus", "value": "304" }, { "tag": "RespReason", "value": "Not Modified" } ] } ] [ { "id": 671731543, "type": "BeReq", "records": [ { "tag": "foo", "value": "bar" }, { "tag": "foo", "value": "bar" }, { "tag": "RespStatus", "value": "200" }, { "tag": "RespReason", "value": "OK" } ] } ]
解决方案
使用jq命令,先提取所有RespStatus记录形成数组,再定位到第n个元素(注意jq数组索引从0开始,第1个元素用[0],第2个用[1],以此类推),判断其值是否符合要求。
示例命令(筛选第2个RespStatus为304的条目)
jq '.[] | select( ([.records[] | select(.tag == "RespStatus")][1].value == "304") )' < requests.log
命令解释
[.records[] | select(.tag == "RespStatus")]:从当前条目的records数组中,筛选出所有tag为RespStatus的记录,生成一个仅包含这些记录的新数组。[1]:定位到这个新数组的第2个元素(索引为1)。.value == "304":判断该元素的value是否等于"304",满足条件的条目会被保留输出。
扩展说明
- 如果要筛选第1个
RespStatus为200的条目,只需将索引改为[0]:jq '.[] | select( ([.records[] | select(.tag == "RespStatus")][0].value == "200") )' < requests.log - 若条目内的
RespStatus数量不足n个,表达式会返回null,这类条目不会被选中,避免误匹配。
内容的提问来源于stack exchange,提问作者jjj
相关产品推荐
相关产品推荐

