2010-04-09 171 views
1

我有一個標準的passwd文件&一個用戶映射文件 - 的格式與AD帳戶名稱(例如bloggsjoe),其映射UNIX名稱(例如jbloggs):
jbloggs bloggsjoe
jsmith的smithjohn
...等
如何編輯passwd文件以將原始unix名稱與AD帳戶名稱交換,以便passwd文件的每一行都具有AD帳戶名稱。
感謝任何幫助perl學習者。AWK或Perl文件編輯&操縱

+0

這兩個文件是否以完全相同的順序包含名稱?一個文件的入口是否比其他文件少?我們在這裏看到多少條目?幾十或幾百萬? – Zaid 2010-04-09 11:08:05

+0

謝謝大家 - 這正是我所需要的 – paul44 2010-04-09 11:55:29

回答

0

這裏有一個awk的一個襯墊做

$ cat map.txt 
jbloggs bloggsjoe 
jsmith smithjohn 

$ cat passwd 
root:x:0:0:root:/root:/bin/bash 
jbloggs:x:493:484:Blogger:/var/run/lib:/sbin/nologin 
jsmith:x:27:481:MySQL Server user:/var/lib/mysql:/bin/bash 

$ awk -F":" 'FNR==NR{gsub(" +",":");m[$1]=$2;next}($1 in m){$1=m[$1]}1' OFS=":" map.txt passwd 
root:x:0:0:root:/root:/bin/bash 
bloggsjoe:x:493:484:Blogger:/var/run/lib:/sbin/nologin 
smithjohn:x:27:481:MySQL Server user:/var/lib/mysql:/bin/bash 
1
#! /usr/bin/perl -T 

use strict; 
use warnings; 
use File::Slurp 'slurp'; 

my ($map_file, $pass_file) = @ARGV or die 'No arguments given!'; 

my %ad_for; 

for my $line (slurp($map_file)) { 
    chomp $line; 
    my ($unix, $ad) = split//, $line; 
    $ad_for{$unix} = $ad; 
} 

for my $line (slurp($pass_file)) { 
    my ($name, @entries) = split /:/, $line; 
    if ($ad_for{$name}) { 
     print join ':', $ad_for{$name}, @entries; 
    } 
    else { 
     warn "name $name doesn't have an ad entry\n"; 
    } 
} 
+0

謝謝,現在我不必寫它。 – 2010-04-09 11:30:47

0

使用Perl,讀取AD文件並填充AD-Unix哈希,然後您可以使用該哈希執行單線程替換。這假設你沒有重複的用戶名,當然。

(未經測試)

my %AD; 

system ("perl -ane '$AD{$F[0]} = $F[1]' unixMap.txt"); 
system ("perl -i -ape 's/$F[0]/$AD{$F[0]}/' passwordFile.txt");