Perl正则表达式,其中模式从linux命令输出

时间:2013-04-04 11:31:57

标签: regex perl

我有一个返回

的linux命令statistics -o -u i1,1,1
max count[0]:=31
max count:=31

我想在我的perl脚本中删除31号。我可以使用awk piped to head

从命令行执行此操作

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

或类似地使用grep

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

或sed ...

如何在perl脚本中执行类似操作?


EDIT 基本上,我想用纯perl解决方案替换perl代码中的反引号系统调用。

1 个答案:

答案 0 :(得分:4)

你可以模仿awk:

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

或者你可以模仿grep:

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

它们不能以相同的方式工作,因为第一个将为包含:=后跟某些内容的任何行提供输出。

-n开关允许读取标准输入或文件,-l处理换行符,-F设置autosplit -a的分隔符。

<强>更新

根据您的评论,您似乎想要用纯perl代码替换系统调用:

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

statistics命令对我来说是未知的,所以我不知道有一种纯粹的perl方法来替换它,尽管cpan上可能存在某些东西。您可以通过在perl中处理输出来节省一个进程。这样的事情应该有效:

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

qx()运算符与反引号完全相同,我只是将其用作个人偏好。