2017-07-26 10 views
2

ログファイルからいくつかのパターンを抽出しようとしていますが、正しく印刷できません。ログ文字列のPerl Regex - 条件付き正規表現を印刷します

例:

1) sequence_history/buckets/FPJ.INV_DOM_16_PRD.47269.2644?startid=2644000&endid=2644666 

2) sequence_history/buckets/FPJ.INV_DOM_16_PRD.41987.9616 

私は3つの事を抽出したい:

A = "FPJ.INV_DOM_16_PRD" B = "47269" C = 9616または2644666(もしライン はその後、他= 2644666 Cをendidたことだ9616)

ログ行するか、1型または2私はAとBを抽出することができるが、私が必要と私はCで立ち往生していますであることそのための条件付きのステートメントと私は適切にそれを抽出することはできません。コードを貼り付けています:

my $string='/sequence_history/buckets/FPJ.INV_DOM_16_PRD.47269.2644?startid=2644000&endid=2644666'; 

if ($string =~ /sequence_history\/buckets\/(.*)/){ 
    my $line = $1; 
    print "$line\n"; 
    if($line =~ /(FPJ.*PRD)\.(\d*)\./){ 
     my $topic_type_string = $1; 
     my $topic_id = $2; 
     print "$1\n$2\n"; 

    } 
if($string =~ /(?(?=endid=)\d*$)/){ 
    # how to print match pattern here? 
    print "match\n"; 
} 

ありがとうございます!

+0

このようなものは、https://regex101.com/r/T6QDMh/1/ですか? – revo

答えて

2

これは仕事を行います。

use Modern::Perl; 
use Data::Dumper; 

my $re = qr/(FPJ.+?PRD)\.(\d+)\..*?(\d+)$/; 
while(<DATA>) { 
    chomp; 
    my (@l) = $_ =~ /$re/g; 
    say Dumper\@l; 
} 

__DATA__ 
sequence_history/buckets/FPJ.INV_DOM_16_PRD.47269.2644?startid=2644000&endid=2644666 
sequence_history/buckets/FPJ.INV_DOM_16_PRD.41987.9616 

出力:

$VAR1 = [ 
      'FPJ.INV_DOM_16_PRD', 
      '47269', 
      '2644666' 
     ]; 

$VAR1 = [ 
      'FPJ.INV_DOM_16_PRD', 
      '41987', 
      '9616' 
     ]; 

説明:

(  : start group 1 
    FPJ : literally FPJ 
    .+? : 1 or more any character but newline, not greedy 
    PRD : literally PRD 
)  : end group 1 
\.  : a dot 
(  : start group 2 
    \d+ : 1 or more digit 
)  : end group 2 
\.  : a dot 
.*?  : 0 or more any character not greedy 
(  : start group 3 
    \d+ : 1 or more digit 
)  : end group 3 
$  : end of string 
+0

ありがとうございます。完璧に動作します。また、正規表現の説明に感謝します。 –

+0

@PushpinderSingh:うれしいことに、嬉しいです。回答を受け入れられたものとして自由に記入してください。https://stackoverflow.com/help/someone-answers – Toto

0

ログ・ファイル内のいくつかのエントリを取得しようとしている場合、あなたはファイルhandlを使用することができますperlでのes。以下のコードでは、test.logという名前のログファイルからエントリを取得しようとしています。

ログのエントリは以下の通りです。

sequence_history/buckets/FPJ.INV_DOM_16_PRD.47269.2644?startid=2644000&endid=2644666 
sequence_history/buckets/FPJ.INV_DOM_16_PRD.41987.9616 
sequence_history/buckets/FPJ.INV_DOM_16_PRD.47269.69886?startid=2644000&endid=26765849 
sequence_history/buckets/FPJ.INV_DOM_16_PRD.47269.24465?startid=2644000&endid=836783741 

以下は、必要なデータを取得するためのperlスクリプトです。

#!/usr/bin/perl 

use strict; 
use warnings; 

open (FH, "test.log") || die "Not able to open test.log $!"; 

my ($a,$b,$c); 
while (my $line=<FH>) 
{ 

     if ($line =~ /sequence_history\/buckets\/.*endid=(\d*)/) 
     { 
       $c= $1; 
       if ($line =~ /(FPJ.*PRD)\.(\d*)\.(\d*)\?/) 
       { 
         $a=$1; 
         $b=$2; 
       } 
     } 
     else 
     { 
       if ($line =~ /sequence_history\/buckets\/(FPJ.*PRD)\.(\d*)\.(\d*)/) 
       { 
         $a=$1; 
         $b=$2; 
         $c=$3; 
       } 
     } 

print "\n \$a=$a\n \$b=$b\n \$c=$c \n"; 
} 

出力:

$a=FPJ.INV_DOM_16_PRD 
$b=47269 
$c=2644666 

$a=FPJ.INV_DOM_16_PRD 
$b=41987 
$c=9616 

$a=FPJ.INV_DOM_16_PRD 
$b=47269 
$c=26765849 

$a=FPJ.INV_DOM_16_PRD 
$b=47269 
$c=836783741 

あなたは、以下のようにデータをフェッチしたいから(そのパスと一緒に)ログファイル名で「test.log」を置き換えることにより、上記のコードを使用することができます。

open (FH, "/path/to/log/file/test.log") || die "Not able to open test.log $!";