You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

命令解释

  1. [.records[] | select(.tag == "RespStatus")]:从当前条目的records数组中,筛选出所有tag为RespStatus的记录,生成一个仅包含这些记录的新数组。
  2. [1]:定位到这个新数组的第2个元素(索引为1)。
  3. .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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 02:10:34