2017-07-26 4 views
2

Ich versuche, einige Muster aus einer Protokolldatei zu extrahieren, aber ich kann sie nicht richtig drucken.Perl Regex - Drucken Sie die passenden Conditional Regex

Beispiele für Protokoll Strings:

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 

I 3 Dinge extrahieren möchten:

A = "FPJ.INV_DOM_16_PRD" B = "47269" C = 9616 oder 2.644.666 (wenn die Leitung hat endid dann C = 2.644.666 sonst ist es 9616)

Logzeile können entweder vom Typ 1 oder 2. ich bin in der Lage A und B zu extrahieren, aber ich bin mit C stecken, wie ich eine Notwendigkeit bedingte Aussage dafür und ich kann es nicht richtig extrahieren. Ich gebe meinen Code ein:

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"; 
} 

Vielen Dank im Voraus!

+0

So etwas wie https://regex101.com/r/T6QDMh/1/? – revo

Antwort

2

Dies wird die Arbeit machen:

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 

Ausgang:

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

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

Erläuterung:

(  : 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

Vielen Dank. Funktioniert perfekt. Danke auch für die Erklärung der Regex. –

+0

@PushpinderSingh: Gern geschehen, froh, dass es hilft. Fühlen Sie sich frei, die Antwort als akzeptiert zu markieren, siehe: https://stackoverflow.com/help/someone-answers – Toto

0

Wenn Sie einige Einträge in Log-Datei zu holen versuchen , dann können Sie Dateihandl verwenden es in Perl. Im unteren Code versuche ich, die Einträge aus einer Protokolldatei namens test.log

zu holen. Einträge des Protokolls sind wie folgt.

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 

Unten ist das Perl-Skript zum Abrufen der erforderlichen Daten.

#!/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"; 
} 

Ausgang:

$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 

Sie können den obigen Code verwenden, indem Sie „test.log“ von Protokolldateinamen (zusammen mit seinem Pfad) zu ersetzen, von dem Sie Daten holen, wie unten gezeigt.

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