gpt4 book ai didi

linux - 用于查找两个值之间差异的 Shell 脚本

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:56:23 26 4
gpt4 key购买 nike

我需要在 /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

最佳答案

这里有一些可以帮助您入门的内容:

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 的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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com