1

HP-UX サーバー上で絶え間なく更新されている大量のログ ファイルがあります。Perl コードを作成して、使用している文字列が含まれるログ ファイルの名前を見つけました。Perl は分割を使用してファイル名を取得し、それを変数に渡します。ユーザー入力を使用して、開始文字列と停止文字列を 2 つの変数として作成します。

my $ssh = Net::OpenSSH->new($host, user => $user,
        master_opts => [ -o => 'NumberOfPasswordPrompts=1',
                         -o => 'PreferredAuthentications=keyboard-interactive,password'],
login_handler => \&login_handler);

$ssh-> error and die "Unable to connect" . $ssh->error;
my $output=$ssh->capture("grep .$userinput1. /app/bea/user_projects/domains/granite/om_ni.log*");

my $array = (split ":", $output)[0];
print "$array"."\n";

[編集]: ご要望どおり、上記は $array がどのように埋められるかの始まりです。以下は awk シーケンスが始まる場所です:

my $a= "INFO - $userinput1";print $a;
my $b= "INFO - ProcessNode terminated... [$userinput1]";print $b;

awk を ssh キャプチャ コマンドの一部として使用すると、ログ ファイル全体を検索し、文字列 $a と文字列 $b の間のすべての行をキャプチャしてから、別の配列内のすべてを取得します。

my $output2=$ssh->capture("awk -v i=$array '$a,$b' i");

ここで $array は、ログ ファイルのフル パスが保持される場所であり、パス変数として完全に正常に機能します。-v パラメータなしで awk を使用してみましたが、まったく問題ありませんでした。

[編集 2]:これは print "$array"."\n"; の結果です。

/app/bea/user_projects/domains/granite/om_ni.log.2

perl スクリプトを実行すると、次の結果が得られます。

INFO - 28B26AD1-E959-4F5F-BD89-A7A6E601BE18INFO - ProcessNode terminated... [28B26AD1-E959-4F5F-BD89-A7A6E601BE18] syntax error The source line is 1.
The error context is
INFO - 28B26AD1-E959-4F5F-BD89-A7A6E601BE18,INFO - ProcessNode >>>  terminated. <<< ..  [28B26AD1-E959-4F5F-BD89-A7A6E601BE18]
awk: Quitting
The source line is 1. 

どういうわけか「終了」単語を指すエラーですが、文字列全体にエスケープ文字を使用しても、気にせず、同じエラーを返します。

この問題に関するヘルプは大歓迎です。よろしくお願いします。

4

1 に答える 1

0

よくわかりませんがawk、呼び出し方が正しくないようです。HP-UX での awk のマニュアルは次のとおりです。

シングルクォーテーション($a,$b)で囲まれた部分がプログラムになります。ただし、2 つのテキスト文字列を渡しているため、それらを区切るために引用符さえ付けられていません。これは有効な awk プログラムではありません。したがって、構文エラーです。

あなたが望むのはプログラムのようなものだと思います'/$a/, /$b/'(ただし、繰り返しますが、私はawkの専門家ではありません)。

また、ファイル名を変数に設定し、コマンドを呼び出すときにファイル名の代わりにi使用しています。iなぜこれを行っているのかわかりません。また、ファイル名に変数を使用してもうまくいかないと思います。ファイル名の位置で(わかりやすくするため$arrayに名前を変更する必要があります)を使用するだけです。$file

したがって、コマンド全体は次のようになります。

"awk '/$a/,/$b/' $file"

この 1 つのコマンドで、Perl、SSH、および awk の 3 つの異なるツールを処理します。これはデバッグが非常に困難です。問題が発生した場合、問題の場所を特定するのが難しいからです。このような作業を行うには、タスクを小さな部分に分解することが不可欠です。

この場合は、手動でサーバーに SSH 接続し、コマンドが正しくなるまで awk をいじる必要があることを意味します。awk コマンドを正しく使用できることが確実な場合にのみ、Perl に組み込むようにしてください。このようにタスクを分解すると、はるかに簡単になります。

于 2013-04-29T08:08:38.987 に答える