1

netstatLinux のコマンドで基本的な正規表現マッチングを実行するスクリプトを作成しています。私の正規表現は正常に機能し、必要な列を 5 つのグループ (プロトコルと 2 組の IP アドレスとポート番号) で取得します。

次に、正規表現で netstat の出力に対してグローバル マッチを実行し、結果の配列全体を反復処理して、情報をいくつかの列に出力します。

my $content = `netstat -na`;
my $REGEX = '([a-z]*) +.* (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}):(\d{1,5}) +(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}):(\d{1,5}).*ESTABLISHED';
foreach ($content =~ m/$REGEX/g) {
    printf ("%-10s%-18s%-10s%-18s%-10s\n", $1, $2, $3, $4, $5);
}

ただし、最後の一致する行を数回しか印刷しなかったため、これでは望ましい結果が得られませんでした。$1number 変数を間違って使用していたことに気付くのにそれほど時間はかかりませんでした$5。これらは常に、正規表現に一致した最後の行の番号付きグループを参照していました。

これで問題が残ります。元の正規表現で定義したグループを、グローバル マッチが返す行で使用したいと考えています。これはまったく可能ですか、それともグローバル マッチングは単に grep のような操作を実行する方法ですか?

グローバル マッチの実行中にこれらのグループを保存する方法や、後で配列から取得する方法がない場合は、グローバル マッチをあきらめて、グループを複数のグループに保存するために行全体を反復処理する必要があります。次元配列。netstatこの場合、最初にパイプするだけに誘惑されgrepます...

4

1 に答える 1

1

すべての一致を一度に作成するのではなく、一度に 1 つずつ一致を繰り返すように、 に変更foreachしてみてください。while

while ($content =~ m/$REGEX/g) {
于 2012-11-30T12:22:24.810 に答える