我需要在下面找到"WAM1"
和"WAM2"
之间的区别
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
因为下面的程序有一些错误
#!/bin/bash
file="/var/log/messages"
apploaded="WAM1"
appcreated="WAM2"
timepattern="{s/.*T[0-9]*:[0-9]*:\([0-9]*\.[0-9]*\)Z.*/\1/g;p}"
stop=`sed -n /$apploaded/$timepattern $file`
start=`sed -n /$appcreated/$timepattern $file`
delta=$(awk "BEGIN{print $stop-$start}")
echo Delta=$delta
输出类似
(WAM2-WAM1) = (22.746751-18.535639) = 4.211112 (Expected Output)
Delta== 4.211112
最佳答案
这里有一些东西可以让你开始:
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()
函数。这段代码可能会更多,但对于大量的案例会很有用。输出:
$ 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
关于linux - Shell脚本查找两个值之间的差异,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17598799/