moadeep
moadeep

Reputation: 4098

Perl regex where pattern is output from linux command

I have a linux command statistics -o -u i1,1,1 which returns

max count[0]:=31
max count:=31

I would like to pluck out the number 31 in my perl script. I can do it from the command line using awk piped to head

statistics -o -u i1,1,1 | awk -F':=' '{print $2}' | head -n1

or similarly using grep

statistics -o -u i1,1,1 | grep -Po '(?<=max count:=)\d+'

or sed...

How can I do similar within a perl script?


EDIT Essentially, I would like to replace a backtick system call inside perl code with a pure perl solution.

Upvotes: 2

Views: 1128

Answers (1)

TLP
TLP

Reputation: 67918

You can emulate the awk:

perl -F":=" -lane 'print $F[1]'

Or you can emulate the grep:

perl -nle 'print /(?<=max count:=)(\d+)/'

They do not work in the same way, in that the first one will give output for any line that contains := followed by something.

The -n switch allows for reading of stdin or files, -l handles newlines and -F sets the delimiter for autosplit -a.

Update:

According to your comment, it seems what you want is to replace a system call with pure perl code:

my $variable = `statistics -o -u i1,1,1 | grep -Po '(?<=max count:=)\d+'`;

The statistics command is unknown to me, so I do not know of a pure perl way to replace it, though something might exist on cpan. You can save yourself one process by processing the output in perl though. Something like this should work:

my @lines = grep /max count:=/, qx(statistics -o -u i1,1,1);
my ($num) = $lines[0] =~ /max count:=(\d+)/;

The qx() operator works exactly the same way as backticks, I just use it as a personal preference.

Upvotes: 4

Related Questions