在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
相关产品推荐
相关产品推荐

