[英]Perl script throws syntax error for awk command
我有一个包含每个用户用户名和密码的文件。 我需要通过使用 awk 命令将用户 ID 作为搜索元素传递来从该文件中获取用户 ID 和密码。
user101,smith,smith@123
user102,jones,passj@007
user103,albert,albpass@01
我在我的 perl 脚本中使用 awk 命令,如下所示:
...
...
my $userid = ARGV[0];
my $user_report_file = "report_file.txt";
my $data = `awk -F, '$1 ~ /$userid/ {print $2, $3}' $user_report_file`;
my ($user,$pw) = split(" ",$data);
...
...
在这里我收到错误:
awk: ~ /user101/ {print , }
awk: ^ syntax error
但是如果我在终端窗口中运行相同的命令,它能够给出如下结果:
$] awk -F, '$1 ~ /user101/ {print $2, $3}' report_file.txt
smith smith@123
这里可能是什么问题?
反引号是双引号上下文,因此您需要转义任何希望awk
解释的文字$
。
my $data = `awk -F, '\$1 ~ /$userid/ {print \$2, \$3}' $user_report_file`;
如果您不这样做,您就是在从上次成功的 Perl 匹配中插入捕获变量。
当我遇到这些问题时,我首先将命令作为字符串尝试,看看它是否符合我的预期:
my $data = "awk -F, '\$1 ~ /$userid/ {print \$2, \$3}' $user_report_file";
say $data;
这是该命令的 Perl 等效项:
$ perl -aF, -e '$F[0]=~/101/ && print "@F[1,2]"' report_file
但是,这可能是您在 Perl 中想要做的事情,而不是创建另一个进程:
foo.txt; rm -rf /
foo.txt; rm -rf /
.awk
是路径中的第一个,所以有人可以把它变成一个完全不同的程序(所以使用完整路径,比如/usr/bin/awk
)。在程序内部,您无法获得所有快捷方式,但如果这是程序中速度较慢的部分,您可能需要重新考虑如何访问这些数据,因为使用任何工具扫描整个文件都不会这么快:
open my $fh, '<', $user_report_file or die;
while( <$fh> ) {
chomp;
my @F = split /,/;
next unless $F[0] =~ /\Q$userid/;
print "@F[1,2]";
last; # if you only want the first one
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.