1

我需要在下面找到"WAM1"和之间的区别"WAM2"/var/log/messages

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
4

3 回答 3

1

这里有一些让你开始的东西:

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
于 2013-07-11T17:36:50.487 回答
1

我会使用循环来查找您想要的行。原因很简单。WAM1如果您有多个和WAM2条目,它将允许您处理要做什么。以下假设只有一个WAM1and 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-11T17:40:41.743 回答
1

通读您的评论,您似乎只想要秒值之间的差异。

我相信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.21111
于 2013-07-11T17:48:35.187 回答