在perl中使用管道执行shell命令

时间:2014-05-20 04:54:53

标签: perl shell

我希望在perl脚本的变量中捕获shell命令的输出,只在管道“|”之前的命令的第一部分正在执行,执行脚本时没有错误

File.txt 
Error input.txt got an error while parsing 
Info  output.txt has no error while parsing 

my $var = `grep Error ./File.txt | awk '{print $2}'`;
print "Errored file $var";

错误文件错误input.txt在解析时遇到错误

我只想输入由awk命令过滤但未发生的input.txt。请帮忙

2 个答案:

答案 0 :(得分:2)

始终在每个perl脚本中包含use strict;use warnings;

如果有,你会收到以下警告:

Use of uninitialized value $2 in concatenation (.) or string at scratch.pl line 4.

这会提醒你注意你的命令中的问题,即$ 2变量被插值而不是被视为文字。

有三种方法可以避免这种情况。

1)您可以执行mob建议的操作,只需逃避$ 2

my $var = `grep Error ./File.txt | awk '{print \$2}'`

2)您可以使用带有单引号的qx形式的反引号,这样它就不会进行插值,尽管这不太理想,因为您在命令中使用了单引号:

my $var = qx'grep Error ./File.txt | awk \'{print $2}\''

3)你可以使用纯粹的perl解决方案。

use strict;
use warnings;

my ($var) = do {
    local @ARGV = 'File.txt';
    map {(split ' ')[1]} grep /Error/, <>;
};

答案 1 :(得分:1)

$中的$2由Perl插值,因此shell接收的命令如下:

grep Error ./File.txt | awk '{print }'

(如果您最近将正则表达式与捕获组匹配,则为其他内容)。解决方法是逃避美元符号:

my $var = `grep Error ./File.txt | awk '{print \$2}'`