如何在命令行上使用Perl来搜索其他程序的输出?

时间:2009-01-22 16:56:25

标签: perl unix command-line

据我所知(Perl对我来说很新)Perl可以用来编写Unix命令行的脚本。我想要做的是运行(硬编码)命令行调用,并搜索这些调用的输出以进行RegEx匹配。有没有办法在Perl中做到这一点?怎么样?

编辑:这里的顺序是: - 另一个程序。 - 针对其输出运行正则表达式。

6 个答案:

答案 0 :(得分:10)

my $command = "ls -l /";
my @output = `$command`;
for (@output) {
    print if /^d/;
}

qx//准引用运算符(反引号是快捷方式)从shell语法中被盗:在新shell中将字符串作为命令运行,并返回其输出(作为字符串或列表,视情况而定)。有关详细信息,请参阅perlop

您也可以打开烟斗:

open my $pipe, "$command |";
while (<$pipe>) {
    # do stuff
}
close $pipe;

这允许您(a)避免立即将整个命令的输出收集到内存中,并且(b)让您更好地控制运行命令。例如,您可以避免shell解析命令:

open my $pipe, '-|', @command, '< single argument not mangled by shell >';

有关详细信息,请参阅perlipc

答案 1 :(得分:5)

正如其他人所提到的,你可以在没有Perl的情况下逃脱。但是,如果您需要一些Perl功能,例如扩展的正则表达式功能或其他文本操作,您可以将输出传输到perl,然后执行您需要的操作。 Perl的-e开关让你在命令行上指定Perl程序:

command | perl -ne 'print if /.../'

您可以将其他几个开关传递给perl,以使其在命令行上非常强大。这些记录在perlrun中。另请查看Randal Schwartz's Unix Review column中的部分文章,尤其是他的first article for them。你也可以谷歌Perl one liners找到很多例子。

答案 2 :(得分:2)

#!/usr/bin/perl

sub my_action() {
        print "Implement some action here\n";
}

open PROG, "/path/to/your/command|" or die $!;
while (<PROG>) {
        /your_regexp_here/ and my_action();
        print $_;
}
close PROG;

这将扫描您的命令输出,匹配正则表达式并执行一些操作(现在正在打印该行)

答案 3 :(得分:2)

你需要Perl吗? <怎么样

command -I use | grep "myregexp" && dosomething

在shell中?

答案 4 :(得分:2)

在Perl中,您可以使用反引号在shell上执行命令。这是一个document on using backticks。我不确定如何捕获输出,但我确信不仅仅是一种方法

答案 5 :(得分:-1)

你确实在这种情况下使用单线程。我最近编写了一个我使用的方法,其中包括生成输出,该输出列出了.zip存档中存在的目录结构(每行一个目录条目)。因此,使用该输出作为我们想要过滤的命令输出的示例,我们可以放入一个管道,然后使用带有-n -e标志的perl来过滤传入的数据(和/或用它做其他事情) ):

[command_producing_text_output] | perl -MFile::Path -n -e \
   "BEGIN{@PTM=()} if (m{^perl/(bin|lib(?!/site))}) {chomp;push @PTM,$_}" ^
-e "END{@WDD=mkpath (\@PTM,1);" ^
-e "printf qq/Created %u dirs to reflect part of structure present in the .ZIP file\n/, scalar(@WDD);}"

使用的shell语法,包括:引用perl代码和转义换行符,反映了类似Windows NT的控制台中的CMD.exe用法。如果你需要,精神上更换 “^”在适当的位置加上“\”和“with”。

上面的单行添加仅添加以“perl / bin”开头的目录名称 “perl / lib(后面没有”/ site“);然后创建那些目录。你风 用一棵(空的)树,你可以用它来达到你想要的任何邪恶目的。

重点是说明有可用的标志(-n-p) 允许perl循环遍历每个输入记录(行),并且你可以做的就是复杂性无限制。