1

这应该很简单,但我遇到了 awk 脚本流程的问题。我运行以下脚本,它一遍又一遍地打印输出(如果我不得不猜测我会说它为输入文件的每一行打印一次)。根据要求,这是一些假输入:

[30000] (03/20 00:00:02.950):{0x2D90} Pattern1 5.0.3.57  
[30000] (03/20 00:00:03.911):{0x2D90} Pattern2 5.0.3.57  
[30000] (03/20 00:00:02.950):{0x2D90} Pattern3 5.0.3.16  
[30000] (03/20 00:00:03.911):{0x2D90} Pattern4 5.0.3.16

这是脚本:

/Pattern1/ {
    gsub(/\./,"");
    agtver=$5;
}

/Pattern2/ {
         gsub(/\./,"");
    ctrver=$5;
}

{
if (agtver ~ 50357 && ctrver ~ 50357) {
        print "Blamo!";
}
else print "No blamo. :("
}

这是我得到的输出:

[chawkins@chawkins-DT Devel]$ ./fakeawk.awk < fake.txt  
No blamo. :(  
Blamo!  
Blamo!  
Blamo!

Blamo!如果模式匹配,我期望的输出是单一的,如果不匹配,则输出是单一的No blamo. :(

问题似乎是有三个单独的 { ... } 部分,但我需要这些能够处理两种模式......除非有办法浓缩它。

4

2 回答 2

1

如果您在第一次之后再也没有看到 pattern1 和 pattern2,那么 agtver 和 ctrver 保持设置。您必须再次将它们归零。

编辑添加的调试输出,您应该能够看到逻辑失败的地方。用您的数据测试,感谢您添加!

/Pattern1/ { gsub(/\./,""); agtver=$5;}    
/Pattern2/ { gsub(/\./,""); ctrver=$5;}   
{
   #dbg print "\n#dbg: $5=" $5 "xx\tagtver=" agtver "xx\tctrver=" ctrver "xxx\t$0=" $0
   if (agtver ~ 50357 && ctrver ~ 50357) {
     print "Blamo!";
     agtver="" ; ctrver=""
   }
   else print "No blamo. :("
}

./fakeawk.awk < fake.txt 

输出

No blamo. :(
Blamo!
No blamo. :(
No blamo. :(

我希望这有帮助。

于 2012-04-04T22:38:26.787 回答
0

发射器:

@(gather :vars (agtver ctrver))
@  (skip :greedy) @/Pattern1/ @{agtver /5\.0\.3\.57/}
@  (skip :greedy) @/Pattern2/ @{ctrver /5\.0\.3\.57/}
@(end)
@(do (put-string "Blamo!\n"))

输出:

$ txr fake.txr fake.log
Blamo!

$ echo "junk" | txr fake.txr -
false

@(gather)指令非常适合这一点。它匹配可以以任何顺序出现的材料,并:vars (agtver ctrver)添加必须为这两个变量找到绑定的约束,否则会发生故障。

然后,我们可以将我们正在寻找的两个独立条件表示为一对独立的整行模式匹配,它们绑定了两个不同的变量。

该逻辑可以理解为“请扫描输入以收集绑定变量agtverctrver否则失败”。然后指定收集变量的规则,每行一个。

我们真的不需要打印的副作用Blamo!:程序的成功或失败终止告诉我们一切。

于 2012-04-05T19:07:27.640 回答