如何使用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命令有三个问题:
.[].data.payload[]已经在遍历payload数组的每个对象,不需要额外加.map()- 字段名写错了,应该是
.createdAt而不是.type - 命令末尾缺了闭合的括号,导致语法错误
正确的筛选方法
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
相关产品推荐
相关产品推荐

