0

ファイルがあります。

Sun Sep  9 12:34:42 2012 : Sun Sep  9 12:34:42 2012 : [Req] Send Bcast 
Sun Sep  9 12:34:32 2012 : RX FROM :152.14.189.4 MESG: 
Sun Sep  9 12:34:32 2012 : info  
Sun Sep  9 12:34:32 2012 : #ip=1.1.1.4 
Sun Sep  9 12:34:32 2012 : RX FROM :13 
Sun Sep  9 12:34:32 2012 : #ip=1.1.1.13  
Sun Sep  9 12:34:32 2012 : RX FROM :9 
Sun Sep  9 12:34:32 2012 : #ip=1.1.1.9  
Sun Sep  9 12:34:32 2012 : RX FROM :14 
Sun Sep  9 12:34:32 2012 : #ip=1.1.1.14 
Sun Sep  9 12:34:32 2012 : RX FROM :5 
Sun Sep  9 12:34:32 2012 : #ip=1.1.1.5 
Sun Sep  9 12:34:35 2012 : Reply back to 9 
Sun Sep  9 12:34:35 2012 : Reply back to 13
Sun Sep  9 12:34:36 2012 : Reply back to 14
Sun Sep  9 12:34:37 2012 : Reply back to 1.1.1.4 
Sun Sep  9 12:34:37 2012 : Reply back to 5 
Sun Sep  9 12:34:42 2012 : Sun Sep  9 12:34:42 2012 : [Req] Send Bcast 
Sun Sep  9 12:34:32 2012 : RX FROM :152.14.189.4 MESG: 
Sun Sep  9 12:34:32 2012 : info  
Sun Sep  9 12:34:32 2012 : #ip=1.1.1.5 
Sun Sep  9 12:34:32 2012 : RX FROM :13 
Sun Sep  9 12:34:32 2012 : #ip=1.1.1.9  
Sun Sep  9 12:34:32 2012 : RX FROM :9 
Sun Sep  9 12:34:32 2012 : #ip=1.1.1.4  
Sun Sep  9 12:34:32 2012 : RX FROM :14 
Sun Sep  9 12:34:32 2012 : #ip=1.1.1.13 
Sun Sep  9 12:34:32 2012 : RX FROM :5 
Sun Sep  9 12:34:32 2012 : #ip=1.1.1.14 
Sun Sep  9 12:34:35 2012 : Reply back to 9 
Sun Sep  9 12:34:35 2012 : Reply back to 14
Sun Sep  9 12:34:36 2012 : Reply back to 13
Sun Sep  9 12:34:37 2012 : Reply back to 4 
Sun Sep  9 12:34:37 2012 : Reply back to 5 

2 行の「Bcast」の間で 1.1.1.4 という値を検索する必要があり、それが ip=1.1.1.1 と 1.1.1.4 に返信するの両方に存在する場合。次に、そのセットを無視する必要があります。それ以外の場合は、違いを 2 つの別々のファイルに書き込む必要があります。perlでやってみました。Bcast と Bcast の間で検索すると、何も印刷されません。私は何か不足していますか?ここに私が書いたものがあります

open my $in,'<',$ARGV[0];
open my $out,'>',"File2.txt";
my $Flag =0;
while(<$in>){
        if (/Bcast/ .. /Bcast/)
        {
          print ;
          if ( ($_ =~ m{ ip=1\.1\.1\.4 }xms) )
          {
                  $Flag=$Flag+1;
                  print " \nMatch is Found !!! Hurray \n" if ($Flag==2);
          }       
        } 
      $Flag=0;
}   

助けてください

4

1 に答える 1

3

/Bcast/ .. /Bcast/同じ行で開始および停止します。/Bcast/ ... /Bcast/はもう少し有望ですが、2 ブロックごとにスキップしていることに気付きます。

実際には、最初のブロックを見つけたら、常に Bcast ブロックにいるので、フリップフロップを使用してブロックにいるかどうかを調べようとするべきではありません。

# 0: Haven't see Bcast
# 1: Haven't seen "#ip=1.1.1.4" in this Bcast.
# 2: Haven't seen "Reply to 1.1.1.4" in this Bcast.
# 3: Found match
my $state = 0;  
while (<>) {   
    if (/Bcast/) {
       $state = 1;
    }

    if ($state == 1) {
       if (/ : \#ip=(\S+)/ && $1 eq '1.1.1.4') {
          $state = 2;
       }
    }
    elsif ($state == 2) {
       if (/ : Reply back to (\S+)/ && $1 eq '1.1.1.4') {
          $state = 3;
          print("Found match\n");
       }
    }
}

元のコードが誤って一致する可能性があることに注意してください1.1.1.43

于 2012-09-18T19:47:25.757 に答える