Поиск в файле /etc/passwd с использованием perl
Я хочу знать, как мне реализовать следующую программу.
Я хочу посмотреть /etc/passwd
файл и искать имена, которые встречаются в более чем полное имя одного человека и печатает полные имена этих людей.
Пока я могу печатать имена пользователей и соответствующие идентификаторы из /etc/passwd
файл. но я не знаю, как эффективно искать вхождения имени пользователя более одного раза по всему файлу. например
@lines
: этот массив будет содержать/etc/passwd
данные файла- Затем я извлекаю имя пользователя из каждой строки массива
@lines
- Теперь я хочу найти это имя пользователя (найденное на шаге 2) в оставшемся списке, и если имя пользователя найдено, выведите эти полные имена.
Я не знаю, как мне реализовать шаг 3.
Любая помощь и руководство было бы здорово...
Например, в файле /etc/passwd хранятся полные имена: 1. Виджайкумар Ядав 2. Сурешкумар Джайн 3. Чандан Рай Затем "Кумар" - это имя пользователя, которое появляется в полном имени Виджайкумар и Сурешкумар, затем выведите эти два имени. на выходе.
Ouput будет 1. Виджайкумар Ядав 2. Сурешкумар Джайн
1 ответ
Я не уверен, какой вывод вы ожидаете, и если мой код делает то, что вы хотите, но следующий код сначала ищет имена пользователей, которые появляются (частично) в чьем-либо полном имени. Затем он показывает, какие имена пользователей появляются в определенном полном имени. Я знаю, что это некрасивый код и, возможно, не самое эффективное решение, но дайте мне знать, если вы ожидаете этого или нет.
#!/usr/bin/perl
use strict;
use warnings;
open PASSWD, "/etc/passwd" or die "$!";
my @usernames;
my @fullnames;
while (<PASSWD>) {
chomp;
# First entry is username, 5th entry is full name if exists.
push @usernames, (split ":", $_)[0];
my $fullname = (split ":", $_)[4];
push @fullnames, $fullname if $fullname ne "";
}
my %found_usernames;
foreach my $username (@usernames) {
foreach my $fullname (@fullnames) {
if ($fullname =~ m/$username/i) {
# Push to the array if full name was already found before.
# Otherwise, create an anonymous array
if (defined $found_usernames{$fullname}) {
push $found_usernames{$fullname}, $username
}
else {
$found_usernames{$fullname} = [$username];
}
}
}
}
# Print
foreach my $key (keys %found_usernames) {
print "Users: ", join(",", @{$found_usernames{$key}}), " appear in fullname $key\n";
}
close PASSWD;