Поиск в файле /etc/passwd с использованием perl

Я хочу знать, как мне реализовать следующую программу.
Я хочу посмотреть /etc/passwd файл и искать имена, которые встречаются в более чем полное имя одного человека и печатает полные имена этих людей.
Пока я могу печатать имена пользователей и соответствующие идентификаторы из /etc/passwd файл. но я не знаю, как эффективно искать вхождения имени пользователя более одного раза по всему файлу. например

  1. @lines: этот массив будет содержать /etc/passwd данные файла
  2. Затем я извлекаю имя пользователя из каждой строки массива @lines
  3. Теперь я хочу найти это имя пользователя (найденное на шаге 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;
Другие вопросы по тегам