我需要在下面的/var/log/messages中找到"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发布于 2013-07-12 01:36:50
这里有一些东西可以让你入门:
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,这也是可行的,因为我们使用一个数组来跟踪它们。在末尾打印的增量将打印一个数字,该数字将是减去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发布于 2013-07-12 01:40:42
我会使用一个循环来查找您想要的行。原因很简单。如果您有多个WAM1和WAM2条目,它将允许您处理要执行的操作。下面假设只有一个WAM1和WAM2,并且WAM1在WAM2之前。
还要注意,这是BSD而不是GNU date命令。GNU date命令的工作方式有所不同,但我面前有一台Mac电脑,而不是Linux机器。
我正在寻找WAM行,并将它们存储在$wam1和$wam2中。一旦我遍历了整个文件,我就可以取出时间戳(我正在用sed做这件事。接下来,我使用date命令将给定时间戳中的日期转换为自1970年1月1日以来的秒数。一旦秒被转换,我就可以从开始中减去结束时间:
while read line
do
if [[ $line == *WAM1 ]]
then
wam1="$line"
fi
if [[ $line == *WAM2 ]]
then
wam2="$line"
fi
done < logfile.txt
timestart=$(sed 's/\.[0-9][0-9]*Z .*//' <<<"$wam1")
timeend=$(sed 's/\.[0-9][0-9]*Z .*//' <<<"$wam2")
start_seconds=$(date -j -f%FT%H:%M:%S +%s $timestart)
end_seconds=$(date -j -f%FT%H:%M:%S +%s $timeend)
((total_time=$end_seconds - $start_seconds))
echo "Total Time = $total_time seconds"Linux/GNU
我刚刚在Linux/GNU上对其进行了测试,结果如下:
while read line
do
if [[ $line == *WAM1 ]]
then
wam1="$line"
fi
if [[ $line == *WAM2 ]]
then
wam2="$line"
fi
done < logfile.txt
timestart=$(sed 's/\.[0-9][0-9]*Z .*//' <<<"$wam1")
timeend=$(sed 's/\.[0-9][0-9]*Z .*//' <<<"$wam2")
start_seconds=$(date --date="$timestart" +%s)
end_seconds=$(date --date="$timeend" +%s)
((total_time=$end_seconds - $start_seconds))
echo "Total Time = $total_time seconds"发布于 2013-07-12 01:48:35
通读你的评论,你似乎只想要秒值之间的差异。
我相信awk可以做到这一切。考虑以下脚本:
awk '$NF ~ /^WAM[12]$/ {
match($1, /[0-9][0-9]\.[0-9]+Z$/)
a[c++] = substr($1, RSTART, RLENGTH-1)
}
END {
print a[1]-a[0]
}' logFile输出:
4.21111https://stackoverflow.com/questions/17598799
复制相似问题