使用jq解析JSON获取最新任务的内容翻译及技术问询规整需求
针对jq提取最新任务执行记录的问题解答
一、问题背景
我有一个包含多任务执行记录的JSON文件,尝试使用以下jq命令筛选出job.name不为空的执行记录,并按id倒序排序后获取最新的一条任务数据:
.[ .executions[] | select(.job.name != null) | select(.job.name) ] | sort_by(.id) | reverse | .[0]
执行该命令后,得到的最新任务JSON片段如下:
{
"argstring": null,
"date-ended": { "date": "2018-04-03T17:43:38Z", "unixtime": 1522777418397 },
"date-started": { "date": "2018-04-03T17:43:34Z", "unixtime": 1522777414646 },
"description": "",
"executionType": "user",
"failedNodes": [ "172.30.61.88" ],
"href": "http:...
}
接下来针对命令的正确性、优化方向以及失败任务的处理逻辑给出解答:
二、命令正确性与优化建议
你的jq命令核心逻辑是成立的,但有几个可以优化的细节:
- 简化筛选条件:
select(.job.name != null) | select(.job.name)属于冗余写法,在jq中非空字符串、非空数组等会被直接判定为true,所以直接用select(.job.name)就能过滤掉job.name为null或空值的记录。 - 优化排序逻辑:
sort_by(.id) | reverse可以替换为sort_by(-.id),直接按id降序排序,代码更简洁高效。 - 修正命令格式:原命令末尾的
' 1.json是指定输入文件为1.json,正确的完整命令应该是:
jq '.[ .executions[] | select(.job.name) ] | sort_by(-.id) | .[0]' 1.json
三、失败任务的定制化处理
如果需要针对包含failedNodes的任务做特殊处理,可以添加额外筛选逻辑:
- 仅提取最新的失败任务:
jq '.[ .executions[] | select(.job.name) | select(.failedNodes != null and .failedNodes | length > 0) ] | sort_by(-.id) | .[0]' 1.json
- 给任务添加失败标记:如果需要在结果中明确标注任务状态,可以新增计算字段:
jq '.[ .executions[] | select(.job.name) | . + {isFailed: (.failedNodes != null and .failedNodes | length > 0)} ] | sort_by(-.id) | .[0]' 1.json
四、补充说明
如果你的JSON文件顶层结构就是executions数组(而非嵌套在某个对象下),那么可以去掉命令开头的.[,简化为:
jq '.[] | select(.job.name) | sort_by(-.id) | .[0]' 1.json
内容的提问来源于stack exchange,提问作者Milister
相关产品推荐
相关产品推荐

