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

如何使用jq根据createdAt字段值提取对应的message字段?

如何用jq根据指定字段值筛选对应字段内容

你的JSON结构

[
    {
        "id": "6a6176c1-b879-8f66-6ccb-2532ec151589",
        "name": "Name",
        "data": {
            "payload": [
                {
                    "initiator": "Manager",
                    "action": "update",
                    "userId": "user",
                    "createdAt": "2023-11-29T08:46:30.202778Z",
                    "message": "<bulky message 1>"
                },
                {
                    "initiator": "clusterManager",
                    "action": "update",
                    "userId": "user",
                    "createdAt": "2023-11-29T08:46:30.202778Z",
                    "message": "<bulky message 2>"
                }
            ]
        }
    }
]

你之前的错误原因

你尝试的jq命令有三个问题:

  1. .[].data.payload[]已经在遍历payload数组的每个对象,不需要额外加.map()
  2. 字段名写错了,应该是.createdAt而不是.type
  3. 命令末尾缺了闭合的括号,导致语法错误

正确的筛选方法

1. 直接指定日期提取所有匹配的message

执行以下命令,会输出所有createdAt匹配指定值的message:

jq '.[].data.payload[] | select(.createdAt == "2023-11-29T08:46:30.202778Z") | .message' /tmp/changelog.json

输出结果:

"<bulky message 1>"
"<bulky message 2>"

2. 只提取第一个匹配的message

如果只需要第一个符合条件的结果,用first过滤:

jq 'first(.[].data.payload[] | select(.createdAt == "2023-11-29T08:46:30.202778Z") | .message)' /tmp/changelog.json

输出结果:

"<bulky message 1>"

3. 用变量动态传递日期

如果要避免硬编码日期,比如用你之前提取的CHANGELOG_DATES数组中的值,可以用jq的--arg参数传参:

TARGET_DATE="2023-11-29T08:46:30.202778Z"
jq --arg date "$TARGET_DATE" '.[].data.payload[] | select(.createdAt == $date) | .message' /tmp/changelog.json

语法说明

  • .[].data.payload[]:遍历外层数组的每个对象,再遍历data.payload数组内的每一个元素
  • | select(.createdAt == "指定值"):筛选出createdAt字段与目标值匹配的对象
  • | .message:从匹配的对象中提取message字段

内容的提问来源于stack exchange,提问作者Ilya Shmadchenko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 02:27:42