这里有一些让你开始的东西:
awk '
/WAM1/{ split($1,start,/[:Z]/); wam1[++i]=start[3] }
/WAM2/{ split($1,stop,/[:Z]/); wam2[++j]=stop[3] }
END { len=i>j?i:j; for(;x<len;) print "Delta "++x" = "wam2[x]-wam1[x] }
' log
请注意,这可能不是您的最终解决方案,但可以引起您的注意。此代码假定年、月、日、小时和分钟相同,并且仅在秒级别计算差异。如果那是你的真实情况,这应该有效。
如果您有几行 WAM1 和 WAM2,这也将起作用,因为我们使用数组来跟踪它们。最后打印的 Delta 将打印一个数字,该数字将作为减去 WAM1 和 WAM2 事件的参考。然而,这里假设两者都应该存在。
如果您需要制作更通用的脚本,我建议您使用awk's mktime()
function. 代码会更多,但会对大量案例有用。
输出:
$ cat log
2013-07-09T02:20:18.535639Z user.info WbAppMg WAM1
2013-07-09T02:20:21.817372Z user.info sam SAM
2013-07-09T02:20:21.818442Z user.info sam SAM
2013-07-09T02:20:22.746751Z user.info WbAppMg WAM2
2013-07-09T02:20:23.846636Z user.info sam SAM
2013-07-09T02:20:24.851727Z user.info sam SAM
2013-07-09T02:20:18.535639Z user.info WbAppMg WAM1
2013-07-09T02:20:21.817372Z user.info sam SAM
2013-07-09T02:20:21.818442Z user.info sam SAM
2013-07-09T02:20:22.746751Z user.info WbAppMg WAM2
2013-07-09T02:20:23.846636Z user.info sam SAM
2013-07-09T02:20:24.851727Z user.info sam SAM
2013-07-09T02:20:18.535639Z user.info WbAppMg WAM1
2013-07-09T02:20:21.817372Z user.info sam SAM
2013-07-09T02:20:21.818442Z user.info sam SAM
2013-07-09T02:20:22.746751Z user.info WbAppMg WAM2
2013-07-09T02:20:23.846636Z user.info sam SAM
2013-07-09T02:20:24.851727Z user.info sam SAM
2013-07-09T02:20:18.535639Z user.info WbAppMg WAM1
2013-07-09T02:20:21.817372Z user.info sam SAM
2013-07-09T02:20:21.818442Z user.info sam SAM
2013-07-09T02:20:22.746751Z user.info WbAppMg WAM2
2013-07-09T02:20:23.846636Z user.info sam SAM
2013-07-09T02:20:24.851727Z user.info sam SAM
<!-->
$ awk '
/WAM1/{ split($1,start,/[:Z]/); wam1[++i]=start[3] }
/WAM2/{ split($1,stop,/[:Z]/); wam2[++j]=stop[3] }
END { len=i>j?i:j; for(;x<len;) print "Delta "++x" = "wam2[x]-wam1[x] }' log
Delta 1 = 4.21111
Delta 2 = 4.21111
Delta 3 = 4.21111
Delta 4 = 4.21111