繁体   English   中英

Perl 脚本抛出 awk 命令的语法错误

[英]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 )。
  • 污点检查可以告诉您何时将未经消毒的数据传递给 shell。

在程序内部,您无法获得所有快捷方式,但如果这是程序中速度较慢的部分,您可能需要重新考虑如何访问这些数据,因为使用任何工具扫描整个文件都不会这么快:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM