regex - Perl regular expressions to capture parts of command output -


edited question : have added third function. have come regex seems correct . (1st , 2nd function work expected. )

i have written couple of functions in library, , call functions test script. i'm having issues regular expressions. can me out regular expressions?

function 1:

sub ipsec_version {     ($self)  = @_;     $cmd     = 'sudo -s ipsec version ';     $version = 0;     #execute command    $self->execute($cmd);     foreach $line ( @{ $self->get_stdout() } ) {         if ( $line =~ m/strongswan/msx ) {             $version = $1;         }     }    return $version;  } 

function call:

$self->{'ipsec_version'} = $self->{'ipsec_obj'}->ipsec_version(); info('[startup] ipsec version  : ' .  $self->{'ipsec_version'} ); 

actual output:

use of uninitialized value in concatenation (.) or string @ ... line 37.      ipsec version  :  

expected output:

strongswan u5.1.2/k3.16.0-30-generic 

command output:

i need script capture expected output string this

linux strongswan u5.1.2/k3.16.0-30-generic institute internet technologies , applications university of applied sciences rapperswil, switzerland see 'ipsec --copyright' copyright information. 

function 2:

sub ipsec_status {     ($self,$connection_name) = @_;    $cmd = 'sudo -s  ipsec status ' .  $connection_name;    $status = 0;     #execute command    $self->execute($cmd);     foreach $line ( @{ $self->get_stdout() } ) {         if ( $line =~ m/security\sassociations\d\()/ ) {             $status = $1;         }     }      return $status; } 

function call:

   $self->{'ipsec_status'} = $self->{'ipsec_obj'}->ipsec_status('connection');   ('[startup] ipsec status  : '  .  $self->{'ipsec_status'} ); 

actual output:

info    [startup] ipsec status  : 0 

expected output:

security associations (1 up, 0 connecting) 

command output:

i need script capture expected output string this

security associations (1 up, 0 connecting):       connection[3]: established 3 seconds ago, 1.1.1.19[1.1.1.19]...10.81.1.50[10.81.1.50]       connection{3}:  installed, tunnel, esp in udp spis: cb343e86_i abf6d1f2_o 

function 3 :

sub ipsec_restart {      ($self) = @_;     $cmd = 'sudo -s ipsec restart';     $restart = 0;      $self->execute($cmd);      foreach $line ( @{ $self->get_stdout() } ) {      if ( $line =~ /(starting strongswan.*ipsec$)/ ) {           $restart = $1;           last;         }     }      return $restart; } 

function call :

 $self->{'ipsec_restart'} = $self->{'ipsec_obj'}->ipsec_restart();       ('[startup] ipsec restart status   : '  .  $self->{'ipsec_restart'} ); 

expected output : see highlighted text below. checked in https://regex101.com/ . regex seems correct. /(starting strongswan.*ipsec$)/

starting strongswan 5.1.2 ipsec   actual output  : 0 

the problem you're using $1 set if there captures in regular expression using. also, should add last don't go on searching matching line once have found one. lastly, wrong habitually add /m, /s , /x modifiers every regex match regardless of whether make difference, , leading m/ necessary if using other default slash delimiters.

the first function should contain

for $line ( @{ $self->get_stdout } ) {     if ( $line =~ /(strongswan.*\s)/i ) {         $version = $1;         last;     } } 

and second function similar, although looks you're trying match security associations followed digit, isn't in text. have small a instead of capital, fine if use /i modifier. captures security associations , including last closing parenthesis on same line. need?

for $line ( @{ $self->get_stdout } ) {     if ( $line =~ /(security\s+associations.*\))/i ) {         $status = $1;         last;     } } 

Popular posts from this blog