我希望在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。请帮忙
答案 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}'`