从UTC转换到时代shell脚本或awk

好的,我有几个testing项目已经运行了一段时间了,我可以从日志中获得启动时间

Tue Sep 29 09:21:39 UTC 2015: INFO: Tue Sep 29 09:58:12 UTC 2015: INFO: Tue Sep 29 09:58:58 UTC 2015: INFO: Tue Sep 29 10:36:46 UTC 2015: INFO: Tue Sep 29 11:10:26 UTC 2015: INFO: Tue Sep 29 11:52:35 UTC 2015: INFO: Tue Sep 29 12:19:37 UTC 2015: INFO: Tue Sep 29 13:02:04 UTC 2015: INFO: Tue Sep 29 13:55:41 UTC 2015: INFO: Tue Sep 29 13:56:11 UTC 2015: INFO: Tue Sep 29 13:56:17 UTC 2015: INFO: Tue Sep 29 13:56:21 UTC 2015: INFO: 

我希望在后续的input中获得不同的时间,这可能会让我花费每个testing执行的时间。 是否有任何内置的awk命令,我可以使用它们将这些转换为时代,所以我可以很容易地计算差异?

什么是更好的方法? 单线命令会很好。

将每行转换为等效的unix时间戳

 while IFS=: read dt1 dt2 dt3 _; do date -d "$dt1:$dt2:$dt3" '+%s'; done < file.log 1443518499 1443520692 1443520738 1443523006 1443525026 1443527555 1443529177 1443531724 1443534941 1443534971 1443534977 1443534981 

并且在每行之间用秒打印差分时间使用:

 while IFS=: read dt1 dt2 dt3 _; do ts=$(date -d "$dt1:$dt2:$dt3" '+%s') [[ $pt ]] && echo $((ts-pt)) pt="$ts" done < file.log 

输出:

 2193 46 2268 2020 2529 1622 2547 3217 30 6 4 

单行perl解决方案:

 perl -lane '$p=$d; $d=`date -d "@F[0..3]" +%s`; print $d-$p if $p' file.log 

输出:

 2193 46 2268 2020 2529 1622 2547 3217 30 6 4 
  • -n循环输入文件的每一行,不要自动打印该行

  • -l在处理之前删除换行符,然后将其添加回来

  • -a自动分割模式 – 将输入行分割成@F数组。 默认分割为空格

  • -e执行Perl代码

前4个空格分隔的字段被发送到date -d以返回epochseconds。
打印当前行$d和前一行$p之间的差异