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

在Unix中计算部署日志内两个匹配模式间的时间差

日志中计算两个步骤耗时的Unix解决方案

Hey Mahi,作为Unix新手遇到这种问题太正常了,我来给你几个实用的方法,帮你搞定日志里started和completed之间的耗时计算!

首先我们得假设你的日志每行都带有明确的时间戳(这是计算耗时的核心前提),比如常见的日志格式大概是这样:

2024-05-20 09:12:35 [DEPLOY] Application started
2024-05-20 09:14:50 [DEPLOY] Application completed

方法一:基础版awk计算(适合同一天的日志)

awk是处理文本日志的神器,我们可以用它提取时间、转换为秒数后直接相减。直接在终端运行这个命令就行:

awk '
/started/ {
    # 拆分时间部分(假设时间是HH:MM:SS格式,对应日志里的第2列)
    split($2, start_time, ":")
    start_total = start_time[1]*3600 + start_time[2]*60 + start_time[3]
}
/completed/ {
    split($2, end_time, ":")
    end_total = end_time[1]*3600 + end_time[2]*60 + end_time[3]
    duration = end_total - start_total
    print "两个步骤的耗时:" duration " 秒"
    # 可选:格式化输出为更友好的小时/分钟/秒
    printf "格式化显示:%dh %dm %ds\n", int(duration/3600), int((duration%3600)/60), duration%60
}
' your_deploy.log

方法二:进阶版(支持跨天场景)

如果你的部署流程可能跨天,上面的基础版就不准确了。这时候我们可以用mktime把时间转换成Unix时间戳(从1970年开始累计的秒数),不管跨不跨天都能精准计算:

awk '
/started/ {
    # 把日期的横杠换成空格,方便mktime识别(假设日期是YYYY-MM-DD格式,对应日志第1列)
    gsub("-", " ", $1)
    # 拼接日期和时间,转换成时间戳
    start_epoch = mktime($1 " " $2)
}
/completed/ {
    gsub("-", " ", $1)
    end_epoch = mktime($1 " " $2)
    duration = end_epoch - start_epoch
    print "总耗时:" duration " 秒"
    printf "格式化显示:%dh %dm %ds\n", int(duration/3600), int((duration%3600)/60), duration%60
}
' your_deploy.log

小提示

  • 如果你的日志时间格式特殊(比如MM/DD/YYYY或者带毫秒),只需要调整split或mktime的参数就行。比如日志带毫秒的话,可以用substr($2, 1, 8)先去掉毫秒部分再处理。
  • 要是日志里有多组started和completed,上面的脚本会自动计算每一对的耗时哦!

内容的提问来源于stack exchange,提问作者Mahendra Gayam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:30:11