我在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
答案 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保存在数组中似乎更有用