Pushpinder Singh
Pushpinder Singh

Reputation: 123

Perl Regex - Print the matched Conditional Regex

I am trying to extract some patterns out of a log file but I am unable to print them properly.

Examples of log 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 want to extract 3 things :

A = "FPJ.INV_DOM_16_PRD" B = "47269" C = 9616 or 2644666 (if the line has endid then C = 2644666 else it's 9616)

log line can either be of type 1 or 2. I am able to extract A and B but I am stuck with C as I need a conditional statement for it and I am not able to extract it properly. I am pasting my code :

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

Thanks in advance!

Upvotes: 2

Views: 196

Answers (2)

k189
k189

Reputation: 68

If you are trying to fetch some entries in log file, then you can use file handles in perl. In below code i'm trying to fetch the entries from a log file named as test.log

Entries of the log are as below.

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

Below is the perl script to fetch required data.

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

Output:

 $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 

You can use the above code by replacing "test.log" by log file name (along with its path) from which you want to fetch data as shown below.

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

Upvotes: 0

Toto
Toto

Reputation: 91430

This will do the job:

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

Output:

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

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

Explanation:

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

Upvotes: 2

Related Questions