使用perl在/ etc / passwd文件中搜索

时间:2013-10-03 18:28:35

标签: regex arrays perl substring etcpasswd

我想知道如何实施以下程序 我想查看/etc/passwd文件并搜索以多个人的全名出现的姓名,并打印这些人的全名。
到目前为止,我能够从/etc/passwd文件中打印用户名和相应的ID。但我不知道如何有效地在整个文件中多次搜索用户名的出现次数。 例如

  1. @lines:此数组将包含/etc/passwd文件数据
  2. 然后我从数组@lines
  3. 的每一行中提取用户名
  4. 现在我想在剩余列表中搜索此用户名(在步骤2中找到),如果找到用户名,则打印这些全名。
  5. 我不知道应该如何实施第3步。

    任何帮助和指导都会很棒......

    例如 在/ etc / passwd文件中,下面是存储的全名: 1. vijaykumar yadav 2. sureshkumar jain chandan rai 然后'kumar'是出现在vijaykumar和sureshkumar全名中的用户名,然后在输出中打印这两个名字。

    输出将是 1. vijaykumar yadav 2. sureshkumar jain

1 个答案:

答案 0 :(得分: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;