-1

これまでのところ、サーバーのリストに入り、ログファイルからデータを取得するために正規表現を実行する作業コードがいくつかあります。私がやりたいのは、特定のサーバーの正規表現からキャプチャするデータがない場合に、「このサーバーについてレポートするものはありません」というステータスを表示することです。

現在、各サーバーを通過し、データが正規表現と一致する場合は印刷されます。これを処理するために上記のステートメントを出力するelseステートメントを追加しましたが、一致しないすべてのインスタンスに対して出力するようになりました。

変更を追加するに、現在機能している出力のコピーを次に示します。

========================================================================
REPORTING SUMMARY for BACKUP SERVER : hostname1
========================================================================
REPORTING SUMMARY for BACKUP SERVER : hostname2
Mon Jul 05 00:30:02 2010: hostname2:backup:INFO: backup-date=20100705003002
Mon Jul 05 00:30:02 2010: hostname2:backup:INFO: host=hostname2
Mon Jul 05 00:55:25 2010: hostname2:backup:INFO: backup-size=49.75 GB
Mon Jul 05 00:55:25 2010: hostname2:backup:INFO: backup-time=00:25:23
Mon Jul 05 00:55:25 2010: hostname2:backup:INFO: backup-status=Backup succeeded
========================================================================

これが出力のコピーです。「この日付について報告するものはありません」を追加した後:(whileループ内)。基本的に、一致しないたびにこのステートメントを出力します。私は本当にそれが私に1つのステートメントを与えることを望みます。

========================================================================
REPORTING SUMMARY for BACKUP SERVER : hostname1
NOTHING TO REPORT FOR THIS DATE... 
NOTHING TO REPORT FOR THIS DATE... 
NOTHING TO REPORT FOR THIS DATE... 
...
...
========================================================================
NOTHING TO REPORT FOR THIS DATE... 
Mon Jul 05 00:30:02 2010: hostname2:backup:INFO: backup-date=20100705003002
Mon Jul 05 00:30:02 2010: hostname2:backup:INFO: host=hostname2 
NOTHING TO REPORT FOR THIS DATE... 
NOTHING TO REPORT FOR THIS DATE...
Mon Jul 05 00:55:25 2010: hostname2:backup:INFO: backup-size=49.75 GB
Mon Jul 05 00:55:25 2010: hostname2:backup:INFO: backup-time=00:25:23
Mon Jul 05 00:55:25 2010: hostname2:backup:INFO: backup-status=Backup succeeded

コードは次のとおりです。

# Usage: ./test.pl Ju1 05 2010 <logfilepath> hostname1 hostname2 hostname3
use strict;
use warnings;
my($mon,$day,$year,$file) = @ARGV;
splice(@ARGV, 0, 4, ());            
foreach my $server ( @ARGV ) {      
    print "========================================================================\n";
    print "REPORTING SUMMARY for BACKUP SERVER : $server\n";
    open(my $fh,"ssh $server cat $file |") or die "can't open log $server:$file: $!\n";
    while (my $line = <$fh>) {
        if ($line =~ m/.* $mon $day \d{2}:\d{2}:\d{2} $year:.*(host=|ERROR:|backup-date=|backup-size=|backup-time=|backup-status)/) {
            print $line;
            # adding else statement here
            } else {
            print "NOTHING TO REPORT FOR THIS DATE... \n";
        }
    }
    close($fh);
}
4

3 に答える 3

8
  1. ブール値をfalseに設定します。
  2. whileループ内で、正規表現が一致する場合は、ブール値をtrueに設定します。
  3. whileループの外側で、ブール値がまだfalseの場合は、NOTHINGTOREPORTを出力します。
于 2010-07-06T19:22:03.350 に答える
1

これは現在機能します:

use strict;
use warnings;
my($mon,$day,$year,$file) = @ARGV;
my $has_data = 0;
splice(@ARGV, 0, 4, ());            
foreach my $server ( @ARGV ) {     
    print "========================================================================\n";
    print "REPORTING SUMMARY for BACKUP SERVER : $server\n";
    open(my $fh,"ssh $server cat $file |") or die "can't open log $server:$file: $!\n";
    while (my $line = <$fh>) {
        if ($line =~ m/.* $mon $day \d{2}:\d{2}:\d{2} $year:.*(host=|ERROR:|backup-date=|backup-size=|backup-time=|backup-status)/) {
            print $line;
            $has_data=1; #set to true
            #print "Boolean is set to $has_data \n";
        }
    } #end while loop
        if ($has_data==0) {
           print "Boolean is set to $has_data \n";
           print "NOTHING TO REPORT FOR THIS DATE... \n";
        }
       $has_data=0;
       print "Boolean is reset to $has_data \n";
    close($fh);
}
于 2010-07-06T23:21:45.273 に答える
0

私はそうは思いません、私はこれを正しく理解しています。提案どおり(@mcandre)を試し、whileループの外側に配置しても、同じ動作が得られます。このチェックはどこに置くべきですか?

use strict;
use warnings;
my($mon,$day,$year,$file) = @ARGV;
my $boolean = 0;
splice(@ARGV, 0, 4, ());            
foreach my $server ( @ARGV ) {      
    print "========================================================================\n";
    print "REPORTING SUMMARY for BACKUP SERVER : $server\n"; 
    open(my $fh,"ssh $server cat $file |") or die "can't open log $server:$file: $!\n";
    while (my $line = <$fh>) {
        if ($line =~ m/.* $mon $day \d{2}:\d{2}:\d{2} $year:.*(host=|ERROR:|backup-date=|backup-size=|backup-time=|backup-status)/) {
            print $line;
            $boolean=1; #set to true
            #print "Boolean is set to $boolean \n";
        }
    } #end while loop
        if ($boolean=0) {
           print "Boolean is set to $boolean \n";
           print "NOTHING TO REPORT FOR THIS DATE... \n";
        }
    close($fh);
}
于 2010-07-06T22:51:29.713 に答える