使用 sed/awk 计算时间差

使用 sed/awk 计算时间差

我有两列,如下所示,其中包含作业提交日期。

NAME  SUBMIT_TIME
Job1 Apr 25 11:30
Job2 Apr 25 16:30

我需要一个警报,如果当前日期/时间的时差超过 60 分钟,就会触发该警报。

请帮我计算另一列中与当前日期/时间的时差(以分钟为单位)

例如,我需要有一列作为与当前日期/时间的时差。假设一个作业从 11:30 开始运行,现在是 13:30,所以它应该给出 120 分钟作为差异

答案1

如果您的支持时间版本awk有效,并且假设您缺少的年份信息是当前年份,那么您可以执行以下操作:

$ awk -F'[ :]' 'BEGIN{nowtime=systime();
                      mths="JanFebMarAprMayJunJulAugSepOctNovDec";
                     } 
                /[Jj]ob/ {$2=(match(mths,$2)+2)/3; 
                          jobtime=mktime(2022" "$2" "$3" "$4" "$5" "0, 1);
                          print (nowtime-jobtime)/60;
                         }
             ' datafile

如果这种硬编码缺失年份的解决方案对您不满意,因为年份更改(根据我在评论中的查询)没有正确涵盖,则建议更改数据文件的格式,其中包含作业提交日期,其中包含年份格式YYYY

注意:
当 Awk 配备了 GNU 版本中的时间函数时,它会在计算时间增量时进行标准化,这意味着它在更改月份或年份时会考虑不同长度的月份以及闰年。为此,当然需要一个带有日期戳的作业提交数据文件,其中包括年份信息首先。

编辑
刚刚注意到 OP 请求在附加列中提供柱状输出,其中时间增量以分钟为单位。修改后的代码为:

$ awk -F'[ :]' 'BEGIN{nowtime=systime(); mths="JanFebMarAprMayJunJulAugSepOctNovDec";} 
                NR==1 {printf "%s  %s\n",$0,"DELTA(min)"}
                /[Jj]ob/ {mo=(match(mths,$2)+2)/3;
                          jobtime=mktime(2022" "mo" "$3" "$4" "$5" "0, 1); 
                          printf "%s %-4.1f\n",$0,(nowtime-jobtime)/60;
                         }
              ' datafile

NAME  SUBMIT_TIME  DELTA(min)                                       
Job1 Apr 25 11:30 410.2                                       
Job2 Apr 25 16:30 110.2

时差 ( delta) 数字适用于提供的示例数据文件和(我的)系统时间。

编辑:根据 @EdMorton 的建议,
我将 UTC TZ 标志合并1到代码中作为mktime()函数的第二个参数,假设主机 TZ 设置对应于 UTC 时间戳。

相关内容