2016-08-31 2 views
0

Я определил переменную perl внутри скрипта awk.Определить переменную perl внутри оператора AWK

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 

прекрасно работает, когда varible не определен

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

Почему вы даже пытаетесь это сделать? Выполнение 'cat/cut/awk/sort' из perl избыточно? Не могли бы вы объяснить, что вы пытаетесь выбраться из своего '/ etc/passwd'? Глядя на него, все UID между 7600 и 76500? – Sobrique

ответ

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', который он будет печатать. Я не совсем понимаю, что вы на самом деле ищете, потому что вы сортируете в конце - так будет иметь строку с загрузкой чисел в ней.

Но может быть, что-то подобное вам нужно?

#!/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"; 
+0

Извините, мой плохой, это не файл, который я читаю. его команда 'ypcat' в NIS. Я обновил вопрос выше. –

+0

'open' также работает с исполняемыми каналами. – Sobrique

+0

Можете ли вы привести мне пример? –

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 означает, что йо u ожидаем найти только один UID в этом диапазоне, но ваше использование sort говорит, что вы ожидаете многих. Если вы хотите использовать несколько UIDs в одной строке, каждый с последующим переводом строки, то теперь вы можете сказать

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

но мне кажется более полезным, чтобы сохранить UIDs в массиве

Смежные вопросы