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

时间:2017-02-15 00:45:32

标签: awk timestamp gawk

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

实施例: 带有自动门系统的电梯在n层楼上运行。

电梯打开了门:

Start Move to Work_position

电梯门是开着的:

End Move to Work_position

电梯关上了门

Start Move to Home_Position End Move to Home_Position

(准备好的)日志文件:
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  

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  

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  
  

我正在寻找这样的输出:

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  

1 个答案:

答案 0 :(得分:1)

您可以使用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

打印:

Elevator_021 logger:2017-02-13 13:11:33.735 [MONITORING] CYL_A1; Floor_12门;开始移动到Work_position Elevator_021 logger:2017-02-13 13:11:34.800 [MONITORING] CYL_A1; Floor_12 Door; End Move to Work_position - >工作1065毫秒

Elevator_021 logger:2017-02-13 13:26:12.893 [MONITORING] CYL_A1; Floor_12门;开始移动到Home_Position Elevator_021 logger:2017-02-13 13:26:13.898 [MONITORING] CYL_A1; Floor_12 Door; End Move to Home_Position - >回家1005毫秒

Elevator_021 logger:2017-02-13 14:51:03.211 [MONITORING] CYL_A1; Floor_12门;开始移动到Work_position Elevator_021 logger:2017-02-13 14:51:04.276 [MONITORING] CYL_A1; Floor_12 Door; End Move to Work_position - >工作1065毫秒