1

これは非常に単純なはずですが、awkスクリプトのフローに問題があります。次のスクリプトを実行すると、出力が何度も出力されます(推測する必要がある場合は、入力ファイルの行ごとに1回出力すると言えます)。要求に応じて、ここにいくつかの偽の入力があります:

[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. :(です。

問題は、3つの別々の{...}セクションがあることのようですが、これを凝縮する方法がない限り、2つのパターンを処理できるようにするためにこれらが必要です。

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

TXR:

@(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)、これらの変数の両方に対してバインドが検出されなければならないという制約が追加されます。そうでない場合、失敗が発生します。

次に、探している 2 つの独立した条件を、2 つの異なる変数をバインドする独立した行全体のパターン マッチのペアとして表現できます。

ロジックは、「入力をスキャンしてバインド変数を収集するかagtverctrverまたは失敗する」と読むことができます。次に、変数を収集するためのルールを 1 行に 1 つずつ指定します。

印刷の副作用は本当に必要ありませんBlamo!。プログラムの終了の成功または失敗がすべてを教えてくれます。

于 2012-04-05T19:07:27.640 に答える