Awk 测量两个时间戳之间的时间跨度的最佳方法是什么

Awk 测量两个时间戳之间的时间跨度的最佳方法是什么,awk,timestamp,gawk,Awk,Timestamp,Gawk,从日志文件中计算两个时间戳之间的时间间隔的最有效方法是什么? 我知道Excel/Numbers/Refine中的愚蠢解决方案,但我正在寻找一个聪明的awk oneliner 例如: 带有自动门系统的电梯在n层运行 电梯开门: 开始移动到工作位置 电梯门打开: 结束移动到工作位置 电梯关门了 开始移动到主位置 结束移动到起始位置 (准备好的)日志文件: 我正准备这样的输出: 您可以使用gawk执行以下操作: awk 'function dtime(s) { x=mat

从日志文件中计算两个时间戳之间的时间间隔的最有效方法是什么? 我知道Excel/Numbers/Refine中的愚蠢解决方案,但我正在寻找一个聪明的awk oneliner

例如: 带有自动门系统的电梯在n层运行

电梯开门:

开始移动到工作位置

电梯门打开:

结束移动到工作位置

电梯关门了

开始移动到主位置
结束移动到起始位置

(准备好的)日志文件: 我正准备这样的输出:


您可以使用
gawk
执行以下操作:

awk 'function dtime(s) {
         x=match($0, /([0-9]{4}-[0-9]{2}-[0-9]{2}\s[0-9:]+)(\.[0-9]+).*([0-9]{4}-[0-9]{2}-[0-9]{2}\s[0-9:]+)(\.[0-9]+).*(to \w+)_/, arr)
         if (x) {
              s1=arr[1]
              s2=arr[3]
              gsub(/[-:]/, " ", s1)
              gsub(/[-:]/, " ", s2)
              t1=mktime(s1)+arr[2]
              t2=mktime(s2)+arr[4]
              return arr[5] " " (t2-t1)*1000 " ms"
         }
         else
              return ""
         }
BEGIN   {RS=ORS="\n\n"} 
        {print $0 " -> " dtime($0) }' file
印刷品:

电梯021记录器:2017-02-13 13:11:33.735[监控]气缸A1;12楼门;开始移动到工作位置电梯021记录器:2017-02-13 13:11:34.800[监控]气缸A1;12楼门;结束移动到工作位置->工作1065毫秒

电梯021记录器:2017-02-13 13:26:12.893【监控】气缸A1;12楼门;开始移动到起始位置电梯021记录器:2017-02-13 13:26:13.898[监控]气缸A1;12楼门;结束移动至起始位置->至起始位置1005毫秒


电梯021记录器:2017-02-13 14:51:03.211[监控]气缸A1;12楼门;开始移动到工作位置电梯021记录器:2017-02-13 14:51:04.276[监控]气缸A1;12楼门;结束移动到工作位置->工作1065毫秒!但是,不!awk:函数dtime上下文中源代码行2处的语法错误为x=match($0,/([0-9]{4}-[0-9]{2}-[0-9]{2}\s[0-9:+](\.[0-9]+).[0-9]{4}-‌​[0-9]{2}-[0-9]{2}\s[‌​0-9:]+)(\.[0-9]+).*(‌​对于>>>\w+)\uwk/,它远不是POSIX awk中的1行程序,因为它没有时间函数。您可以研究使用
date
进行时间戳转换,或者使用Perl或安装gawk。它可以工作-切换到另一台OS-X机器。但只能使用“预分组”相关行中的-在相关对之间需要一个空行。这是来自
RS=ORS=“\n\n”
,这就是您的示例的显示方式。如果实际数据只是自由格式的文本,则需要额外的步骤。
Elevator_021 logger:  2017-02-13 13:11:33.735 [MONITORING] CYL_A1; Floor_12 Door ;Start Move to Work_position  
Elevator_021 logger:  2017-02-13 13:11:34.800 [MONITORING] CYL_A1; Floor_12 Door ;End Move to Work_position  
to Work 1065 ms  

Elevator_021 logger:  2017-02-13 13:26:12.893 [MONITORING] CYL_A1; Floor_12 Door ;Start Move to Home_Position  
Elevator_021 logger:  2017-02-13 13:26:13.898 [MONITORING] CYL_A1; Floor_12 Door ;End Move to Home_Position  
to Home 1005 ms  

Elevator_021 logger:  2017-02-13 14:51:03.211 [MONITORING] CYL_A1; Floor_12 Door ;Start Move to Work_position  
Elevator_021 logger:  2017-02-13 14:51:04.276 [MONITORING] CYL_A1; Floor_12 Door ;End Move to Work_position  
to Work 3976 ms  
awk 'function dtime(s) {
         x=match($0, /([0-9]{4}-[0-9]{2}-[0-9]{2}\s[0-9:]+)(\.[0-9]+).*([0-9]{4}-[0-9]{2}-[0-9]{2}\s[0-9:]+)(\.[0-9]+).*(to \w+)_/, arr)
         if (x) {
              s1=arr[1]
              s2=arr[3]
              gsub(/[-:]/, " ", s1)
              gsub(/[-:]/, " ", s2)
              t1=mktime(s1)+arr[2]
              t2=mktime(s2)+arr[4]
              return arr[5] " " (t2-t1)*1000 " ms"
         }
         else
              return ""
         }
BEGIN   {RS=ORS="\n\n"} 
        {print $0 " -> " dtime($0) }' file