Json 看起来像这样:
cat test.json |jq -r ".nodes[].run_data"
{
"id": "1234",
"status": "PASSED",
"penultimate_status": "PASSED",
"end_time":"2022-02-28T09:50:05Z"
}
{
"id": "4321",
"status": "PASSED",
"penultimate_status": "UNKNOWN",
"end_time": "2020-10-14T13:52:57Z"
}
我想获取最新运行的“状态”和“结束时间”。不幸的是订单没有固定。这意味着最新的运行可以是列表中的第一个,但也可以是最后一个或中间......
您可以使用
max_by
检索谓词值最高的项目。或者,使用 sort_by
将项目按谓词顺序排列,然后使用 last
或位置 -1
: 提取最后一项
jq '
[.nodes[].run_data]
| max_by(.end_time)
# or: sort_by(.end_time) | last
# or: sort_by(.end_time)[-1]
| {status, end_time}
' test.json
{
"status": "PASSED",
"end_time": "2022-02-28T09:50:05Z"
}
要生成格式化输出,请将
{status, end_time}
替换为相应格式的字符串,例如"\(.end_time): Status \(.status)"
,并为 JSON 解码(原始)输出设置 -r
标志。
您可以使用
transpose
来映射每个对象及其结束时间。
这里我将
end_time
转换为自 Unix 纪元以来的秒数,并输出具有最大秒值的对象(这是最新的)。
[
[. | map(.end_time | strptime("%Y-%m-%dT%H:%M:%SZ") | mktime), [.[0], .[1]]]
| transpose[]
| .[1] += {secs: .[0]} | .[1]
]
| sort_by(.secs) | last
| {status, end_time}
输出
{
"status": "PASSED",
"end_time": "2022-02-28T09:50:05Z"
}
演示