2013-10-03 38 views
0

我想知道如何實現以下程序。
我想查看/etc/passwd文件並搜索出現在多個人的全名中的姓名並打印這些人的全名。
到目前爲止,我能夠從/etc/passwd文件打印用戶名和相應的ID。但我不知道如何在整個文件中有效地搜索多次用戶名。 用於如使用perl搜索/ etc/passwd文件

  1. @lines:此數組將包含/etc/passwd文件數據
  2. 那麼我從陣列@lines
  3. 現在我想搜索該用戶名的各行提取的用戶名(在一步中找到2)在剩餘列表中,如果找到用戶名,則打印這些全名。

我不知道我應該如何實現步驟3

任何幫助和指導,將是巨大的......

對於如 在/ etc/passwd文件follwing是全名存儲: 1. vijaykumar yadav 2. sureshkumar jain 3. chandan rai 然後'kumar'是出現在vijaykumar的全名和sureshkumar然後在輸出中打印這兩個名字的用戶名。

輸出繼電器將是 1. vijaykumar亞達夫 2. sureshkumar耆那教

+3

直到你瞭解Perl _hashes_之後,你才能解決這個問題。 –

+0

在google搜索:perl解析passwd – michael501

+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;