在AWK语句中定义perl变量

时间:2016-08-31 08:04:41

标签: linux bash perl awk

我在awk脚本中定义了一个perl变量。

my $max = 76500;
my $uidNumber = `ypcat passwd | cut -d ":" -f3 | awk -v var=\$max '\$NF >= 76000 && \$NF <= \{print var\}' | sort -n`;
print $uidNumber

运行脚本时出现以下错误

awk: $NF >= 76000 && $NF <= {print var}
awk:                        ^ syntax error

未定义变量时工作正常

my $uidNumber = `ypcat passwd | cut -d ":" -f3 | awk '\$NF >= 76000 && \$NF <= 76500' | sort -n`;
print $uidNumber

2 个答案:

答案 0 :(得分:2)

好的,所以我的第一个答案是:不要。

#!/usr/bin/env perl
use strict;
use warnings;

open ( my $passwd_file, '<', 'passwd' ) or die $!; 

while ( <$passwd_file> ) { 
    chomp;
    my ( $username, $x, $uid, @rest ) = split /:/;
    print $uid,"\n" if $uid >= 76000 and $uid <= 76500;
}

那是没有排序的,它只是在'passwd file'命令中打印出来。我不清楚你实际上在寻找什么,因为你在最后排序 - 所以会有一个带有大量数字的字符串。

但也许这样的东西就是你想要的东西?

#!/usr/bin/env perl
use strict;
use warnings;


open ( my $passwd_file, '<', 'passwd' ) or die $!; 

my @uids; 
while ( <$passwd_file> ) { 
    chomp;
    my ( $username, $x, $uid, @rest ) = split /:/;
    push ( @uids, $uid ) if $uid <=76500 and $uid >= 76000; 
}

print join "\n", sort { $a <=> $b } @uids;

注意 - 正如你在评论中提到的那样,它是一个ypcat命令:

open ( my $input, '-|', 'ypcat passwd' ); 

然后做同样的事情。

对列表进行排序并打印最后一个元素:

print "UID:", (sort { $a <=> $b } @uids )[-1],"\n";

答案 1 :(得分:2)

你可以写

my $uidNumber = `ypcat passwd | cut -d ":" -f3 | awk '\$NF >= 76000 && \$NF <= $max' | sort -n`;

但是您正在编写Perl程序,在Perl中执行此操作会更好,甚至可以作为单个awk命令

my $max = 76_500;

my @uids = do {
    open my $fh, '-|', 'ypcat passwd' or die $!;
    sort { $a <=> $b } grep { $_ >= 76_000 and $_ <= $max } map { (split /:/)[2] } <$fh>;
};

您使用标量$uidNumber意味着您希望在该范围内只找到一个UID,但您使用sort表示您期望很多。如果你想在一个字符串中有多个UID,每个UID后跟一个换行符,那么你现在可以说

my  $uidNumber = join "", map "$_\n", @uids;

但是将UID保存在数组中似乎更有用