Regex 用于捕获部分命令输出的Perl正则表达式

Regex 用于捕获部分命令输出的Perl正则表达式,regex,perl,Regex,Perl,编辑问题:我添加了第三个函数。我想出了一个似乎正确的正则表达式。第一和第二功能按预期工作 我已经在库中编写了两个函数,并从测试脚本中调用了这些函数。我对正则表达式有一些问题。谁能帮我弄一下正则表达式吗 职能1: sub ipsec_version { my ($self) = @_; my $cmd = 'sudo -s ipsec version '; my $version = 0; #execute the command $self->

编辑问题:我添加了第三个函数。我想出了一个似乎正确的正则表达式。第一和第二功能按预期工作

我已经在库中编写了两个函数,并从测试脚本中调用了这些函数。我对正则表达式有一些问题。谁能帮我弄一下正则表达式吗

职能1:

sub ipsec_version {
    my ($self)  = @_;
    my $cmd     = 'sudo -s ipsec version ';
    my $version = 0;

   #execute the command
   $self->execute($cmd);

   foreach my $line ( @{ $self->get_stdout() } ) {
        if ( $line =~ m/strongSwan/msx ) {
            $version = $1;
        }
    }
   return $version;

}
函数调用:

$self->{'ipsec_version'} = $self->{'ipsec_obj'}->ipsec_version();
INFO('[Startup] ipsec version is  : ' .  $self->{'ipsec_version'} );
实际产量:

Use of uninitialized value in concatenation (.) or string at ... line 37.
     ipsec version is  : 
INFO    [Startup] ipsec status is  : 0
预期产出:

strongSwan U5.1.2/K3.16.0-30-generic
Security Associations (1 up, 0 connecting)
命令输出:

我需要脚本来从这个脚本捕获预期的输出字符串

Linux strongSwan U5.1.2/K3.16.0-30-generic
Institute for Internet Technologies and Applications
University of Applied Sciences Rapperswil, Switzerland
See 'ipsec --copyright' for copyright information.
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
职能2:

sub ipsec_status {

   my ($self,$connection_name) = @_;
   my $cmd = 'sudo -s  ipsec status ' .  $connection_name;
   my $status = 0;

   #execute the command
   $self->execute($cmd);

   foreach my $line ( @{ $self->get_stdout() } ) {
        if ( $line =~ m/Security\sassociations\d\()/ ) {
            $status = $1;
        }
    }

    return $status;
}
函数调用:

   $self->{'ipsec_status'} = $self->{'ipsec_obj'}->ipsec_status('connection');
  ('[Startup] ipsec status is  : '  .  $self->{'ipsec_status'} );
实际产量:

Use of uninitialized value in concatenation (.) or string at ... line 37.
     ipsec version is  : 
INFO    [Startup] ipsec status is  : 0
预期产出:

strongSwan U5.1.2/K3.16.0-30-generic
Security Associations (1 up, 0 connecting)
命令输出:

我需要脚本来从这个脚本捕获预期的输出字符串

Linux strongSwan U5.1.2/K3.16.0-30-generic
Institute for Internet Technologies and Applications
University of Applied Sciences Rapperswil, Switzerland
See 'ipsec --copyright' for copyright information.
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
职能3:

sub ipsec_restart {

    my ($self) = @_;
    my $cmd = 'sudo -s ipsec restart';
    my $restart = 0;

    $self->execute($cmd);

    foreach my $line ( @{ $self->get_stdout() } ) {
     if ( $line =~ /(Starting strongSwan.*IPsec$)/ ) {
          $restart = $1;
          last;
        }
    }

    return $restart;
}
函数调用:

 $self->{'ipsec_restart'} = $self->{'ipsec_obj'}->ipsec_restart();
      ('[Startup] ipsec restart status  is  : '  .  $self->{'ipsec_restart'} );
预期输出:请参阅下面突出显示的文本。 我登记了。我的正则表达式似乎是正确的/正在启动strongSwan.*IPsec$/

Starting strongSwan 5.1.2 IPsec


Actual output is  : 0

问题是,您使用的是$1,它仅在您使用的正则表达式中有捕获时设置。此外,您应该添加最后一行,以便在找到匹配行后不再继续搜索。最后,习惯性地将/m、/s和/x修饰符添加到每个正则表达式匹配中是错误的,不管它们是否有任何区别,并且只有在使用默认斜杠分隔符以外的东西时才需要前导的m/

第一个函数应该包含

for my $line ( @{ $self->get_stdout } ) {
    if ( $line =~ /(strongSwan.*\S)/i ) {
        $version = $1;
        last;
    }
}
第二个函数是类似的,尽管看起来您试图匹配紧跟在数字后面的安全关联,而这不是文本中的内容。您也有一个小的a而不是大写字母,如果您也使用/i修饰符也可以。这将捕获同一行上最后一个右括号之前的安全关联。这就是你需要的吗

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

对于函数1,假设所有更改都是版本号,我们可以使用

m/(strongSwan.*?) Institute/ms
作为正则表达式。这将以非贪婪的方式匹配从strongSwan到Institute的所有内容,并将除Institute之外的所有内容存储在1美元中

对于函数2,我们将使用未知数据包含在括号中这一事实

 m/(Security associations \(.*?\))/

对于功能1,您认为会有什么变化?除了突出显示的内容之外,还有其他内容吗?第二个函数的正则表达式部分捕获字符串。ipsec状态为:安全关联0已启动,0未捕获以下部分。。。。连接。所需字符串为安全关联1以上,0connecting@user3587025:您确定已正确复制了我的代码吗?捕获的字符串必须以右括号结尾,因为我正在学习正则表达式。你能解释一下你用的正则表达式吗/strongSwan.*\S/i和/Security\S+关联。*/i OP的问题格式不正确,因此看起来好像命令输出都在一行中。我已经修改了这个帖子来澄清it@Borodin为了清晰起见,我又增加了一个函数并格式化了问题。如果不清楚,请告诉我