如何从Shell命令的输出中提取数字?

时间:2018-06-20 10:11:10

标签: perl

该命令的输出为ent3,并且我希望从该输出中将3存储在变量中

Perl代码

            sub {
            if ( $exit == 1 )
           {
            $cmdStr = "lsdev | grep en | grep VLAN | awk '{ print \$1 }'\r";
            $result =_run_cmd($cmdStr);
            my @PdAt_val =    split("\r?\n", $result);
            my $num = $result =~ /([0-9]+)/;
            print "The char is $num\n";
            $exit = 0;
                exp_continue;

整齐的代码

sub {

    if ( $exit == 1 ) {

        $cmdStr = "lsdev | grep en | grep VLAN | awk '{ print \$1 }'\r";
        $result = _run_cmd($cmdStr);

        my @PdAt_val = split("\r?\n", $result);

        my $num = $result =~ /([0-9]+)/;
        print "The char is $num\n";

        $exit = 0;

        exp_continue;

2 个答案:

答案 0 :(得分:0)

使用正则表达式,类似这样的方法应该起作用:

if($result =~ /([0-9]+)/) {
    $num = $1;
}
print $num;

答案 1 :(得分:0)

您在此处执行工作的代码是:

my $num = $result =~ /([0-9]+)/;

让我们将其放入一个简单的程序中,以便我们可以看到发生了什么事。

#!/usr/bin/perl

use strict;
use warnings;
use feature 'say';

my $result = 'ext3';

my $num = $result =~ /([0-9]+)/;

say $num;

然后打印1。这不是我们想要的。发生了什么事?

好吧,如果您阅读了match运算符的文档(在“ perlop”中的Regexp Quote-Like Operators部分中),您将看到该运算符在不同情况下返回的内容。它说:

  

在字符串中搜索模式匹配,如果成功,则在标量上下文中返回true,如果失败,则返回false。

因此可以解释我们所看到的行为。 “ 1”只是表示匹配成功的真实值。但是我们如何获得括号中所捕获的价值。有两种方法。首先,将其写入$1变量中。

my $num;

if ($result =~ /([0-9]+)/) {
  $num = $1;
}

say $num;

但是我认为另一种方法是您想要的。如果继续阅读,您将看到操作符在列表上下文中返回的内容:

  列表上下文中的

m//返回一个列表,该列表由与模式中的括号匹配的子表达式组成,即($1$2$3 ... )

因此,如果将match运算符放在列表上下文中,那么我们将获得返回的$1的内容。我们如何将匹配项放入列表上下文?通过使表达式成为列表分配-我们可以通过在分配的左侧加上括号来实现。

my ($num) = $result =~ /([0-9]+)/;

say $num;