-2

コマンドの出力に含まれる特定の単語 (C7STH、C7ST2C) の出現回数を見つける必要があります。コマンドは「固定」テキストで開始および終了します - 以下のように START & END です。このコマンドは、ログ ファイル内のさまざまなノードに対して何度も繰り返されます。

...

START
SLC ACL PARMG ST                   SDL                             SLI
 0  A1  17    C7STH-1&&-31         MSC19-0/RTLTB2-385
 1  A1  17    C7STH-65&&-95        MSC19-0/RTLTB2-1697

SLC ACL PARMG ST                   SDL                             SLI
 0  A2   0    C7ST2C-4             ETRC18-0/RTLTB2-417
 1  A2   0    C7ST2C-5             ETRC18-0/RTLTB2-449
 2  A2   0    C7ST2C-6             ETRC18-0/RTLTB2-961
...
END

....

各コマンド出力を取得するためにフリップフロップ演算子 (if (/^START$/ .. /^END$/) を使用しています。

  1. 行ごとに移動せずに、このデータに対して「grep」を実行する方法はありますか? 同様に、「START」と「END」の間のすべてのテキストを配列に取得し、これに対して「grep」を実行できますか?

  2. また、パフォーマンスの観点から、フリップフロップ演算子を使用して複数レベルの if ブロックを使用しても問題ありませんか?

4

3 に答える 3

4

これは簡単な解決策です:

my $number = grep {/particular word/} grep {/START/../END/} <>;

(コード サンプルが提供されていないため、ひし形演算子を使用し、ログ ファイルが引数としてスクリプトに渡されると仮定しました。必要に応じてファイル ハンドルに置き換えてください。)

grep {/START/../END/} <>区切り文字内および区切り文字を含む要素のリストを作成し、grep {/particular word/}そのリストで動作します。

パフォーマンスの観点からは、

for (<>) {
    $number++ if /START/../END/ and /a/;
}

and演算子の優先順位のため、代わりに使用する&&か、フリップフロップ式を括弧で囲む必要があることに注意してください。

両方を組み合わせる:

my $number = grep {/START/../END/ and /particular word/} <>;
于 2012-01-02T13:53:08.413 に答える
1

多分あなたはこれらの線に沿って何かを探しています:

#!/usr/bin/env perl
use strict;
use warnings;
my $word = q(stuff);
my @data;
while (<DATA>) {
    if ( /^START/../^END/ ) {
        chomp;
        push @data, $_ unless /^(?:START|END)/;
    }
    if ( /^END/ ) {
        my $str = "@data";
        print +(scalar grep {/$word/} (split / /,$str)),
            " occurances of '$word'\n";
        @data = ();     
    }
}
__DATA__
this is a line
START of my stuff
more my stuff
and still more stuff
and lastly, yet more stuff
END of my stuff
this is another line
START again
stuff stuff stuff stuff
yet more stuff
END again

...これは次のように出力されます:

3 occurances of 'stuff'
5 occurances of 'stuff'
于 2012-01-02T14:12:17.483 に答える
0

同様に、「START」と「END」の間のすべてのテキストを配列に取得し、これに対して「grep」を実行できますか?

(push @ar,$_) if /START/ .. /END/;
grep {/word/ @ar};

また、パフォーマンスの観点から、フリップフロップ演算子を使用して複数レベルの if ブロックを使用しても問題ありませんか?

NASAで働いていない限り。

于 2012-01-02T14:45:27.790 に答える