0

構成ファイルにあるエラーを検索する Perl のスクリプトがありますが、エラーが発生すると出力されます。構成ファイルの内容を一致させ、最後にエラーが発生したときだけ出力する必要があります。何か案は?


うわー…こんなに反応するとは思わなかった。これは、Nagios にアラートを送信する Windows ボックスでのログ監視用であることをもっと明確にすべきでした。これは実は私にとって初めての Perl プログラムであり、このすべての情報は非常に役に立ちました。これをウィンテルボックスのテールアンサーに適用する方法を知っている人はいますか?

4

4 に答える 4

4

それを行う別の方法:

perl -n -e '$e = $1 if /(REGEX_HERE)/;  END{ print $e }' CONFIG_FILE_HERE
于 2010-08-12T01:43:37.770 に答える
4

正確に何を印刷する必要がありますか?エラーを含む行?それ以上の文脈? File::ReadBackwards役立つことがあります。

于 2010-08-12T05:26:28.293 に答える
3

概要:

my $errinfo;
while (<>)
{
    $errinfo = "whatever" if (m/the error pattern/);
}
print "error: $errinfo\n" if ($errinfo);

これはすべてのエラーをキャッチしますが、最後のエラーだけが生き残る最後まで出力しません。

于 2010-08-11T23:41:20.050 に答える
0

ブルート フォース アプローチでは、 をポイントして独自のパイプラインを設定しSTDOUTますtail。これにより、すべてのエラーを出力できるようにtailなり、最後のエラーだけを出力するかどうかは気にする必要があります。

指定しなかったので、合法的な構成行は次の形式であると想定します

Name = some value

簡単なマッチング:

  • ^(行頭から)
  • \w+(1 つ以上の「単語文字」)
  • \s+(必須の空白が続きます)
  • =(その後に等号が続きます)
  • \s+(より必須の空白)
  • .+(いくつかの必須の値)
  • $(列の最後で終了)

一緒に接着すると、

#! /usr/bin/perl

use warnings;
use strict;

# for demo only
*ARGV = *DATA;

my $pid = open STDOUT, "|-", "tail", "-1" or die "$0: open: $!";
while (<>) {
  print unless /^ \w+ \s+ = \s+ .+ $/x;
}

close STDOUT or warn "$0: close: $!";

__DATA__
This = assignment is ok
But := not this
And == definitely not this

出力:

$ ./lasterr
そして==間違いなくこれではありません

正規表現では、パターンの最後の発生が必要な場合は、パターン^.*の前に配置します。たとえば、入力の最後の X を Y に置き換えるには、次を使用します。

$ エコー XABCXXXQQQXX | perl -pe 's/^(.*)X/$1Y/'
XABCXXXQQQXY

正規表現の量指定子は貪欲である^ため冗長であることに注意してください。

この手法を問題に適用すると、次のプログラムのように、エラーを含む構成ファイルの最後の行を検索できます。

#! /usr/bin/perl

use warnings;
use strict;

local $_ = do { local $/; scalar <DATA> };
if (/\A.* ^(?! \w+ \s+ = \s+ [^\r\n]+ $) (.+?)$/smx) {
  print $1, "\n";
}

__DATA__
This = assignment is ok
But := not this
And == definitely not this

正規表現の構文は、複数の行が含まれているため少し異なり$_ますが、原理は同じです。\Aに似ていますが、検索する文字列の先頭のみ^に一致します。スイッチ (「複数行」)を使用すると、論理的な行の境界で一致します。/m^

ここまででパターンはわかった

/\A.* ^ .../

何かのように見える最後の行に一致します。否定先読みアサーション (?!...)は、有効な構成行ではない行を探します。通常.、改行以外の任意の文字に一致しますが、/sスイッチ (「単一行」)によってこの制限が解除されます。を指定[^\r\n]+すると、つまり、キャリッジ リターンでもライン フィードでもない 1 つ以上の文字が指定された場合、一致が次の行にスピルすることはできません。

ルックアラウンド アサーションはキャプチャしないため、問題のある行を で取得し(.+?)$ます。このコンテキストで安全に使用できる理由は、現在の行が正しくなく、貪欲でない量指定子ができるだけ早く一致を停止すること.がわかっているためです。この場合、現在の論理行の終わりです。+?

これらすべての正規表現は、/xスイッチ (「拡張モード」)を使用して余分な空白を許可します。目的は、読みやすさを向上させることです。

于 2010-08-12T12:32:38.957 に答える