据我所知(Perl对我来说很新)Perl可以用来编写Unix命令行的脚本。我想要做的是运行(硬编码)命令行调用,并搜索这些调用的输出以进行RegEx匹配。有没有办法在Perl中做到这一点?怎么样?
编辑:这里的顺序是: - 另一个程序。 - 针对其输出运行正则表达式。
答案 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循环遍历每个输入记录(行),并且你可以做的就是复杂性无限制。