Bash在终端运行命令后获取字符串

时间:2016-04-07 00:30:44

标签: regex bash shell

在bash我有这样的字符串,请注意第一行,最后一行是空白。

如何获得300号码和20号码?

#first blank line

Found 300 modems:
/org/freedesktop/ModemManager1/Modem/20 [huawei] E3131
/org/freedesktop/ModemManager1/Modem/1 [huawei] E3131
/org/freedesktop/ModemManager1/Modem/0 [huawei] E303

#last blank line

3 个答案:

答案 0 :(得分:1)

这是一个Perl版本......

perl -ne 'if(m[Found (\d+)] || m[Modem/(\d+)]) {print "$1\n"}' < file_name

请注意。你可以使用以下脚本top play与正则表达式...

#!/usr/bin/perl
use strict;
use warnings;

while(<DATA>) {
  if(m[Found (\d+)] || m[Modem/(\d+)]) {
    print "$1 \n";
  }
}
__DATA__
#first blank line

Found 300 modems:
/org/freedesktop/ModemManager1/Modem/20 [huawei] E3131
/org/freedesktop/ModemManager1/Modem/1 [huawei] E3131
/org/freedesktop/ModemManager1/Modem/0 [huawei] E303

#last blank line

如果您将该脚本保存为test.pl,则可以像这样使用它......

perl -ne 'if(m[Found (\d+)] || m[Modem/(\d+)]) {print "$1\n"}' < test.pl

我得到了以下输出......

300
20
1
0

答案 1 :(得分:0)

如果您将该输出存储在名为${var}的变量中,则可以执行

sed -n 's/Found \([0-9]*\) modems:/\1/p' <<< "${var}"

sed遍历字符串中的所有行,-n会抑制输出。如果我们找到Found n modems:的行,我们将其替换为仅数字(s命令)并打印行(p标志)。

答案 2 :(得分:0)

这将打印300,20,1和0:

sed -ne 's/Found \(.*\) modems:/\1/p' -e 's:.*Modem/\([^ ]*\) .*:\1:p' FILENAME

-n表示默认情况下不打印输出 -e COMMAND执行COMMAND。你可以多次使用它 使用s结束p命令表示如果发生任何替换,则打印。

运行man sed了解详情。

如果您真的只想要300和20作为输出,请附加|head -2以限制输出到前两行。