2010-04-09 6 views
1

나는 표준 passwd 파일 & usermap 파일이 ...
passwd 파일을 편집하여 원래 유닉스 이름을 AD 계정 이름으로 바꿔 passwd 파일의 각 줄에 AD 계정 이름이 대신 표시되도록 할 수 있습니까?
Perl 학습자를위한 도움을 주시면 감사하겠습니다.AWK 또는 Perl 파일 편집 및 조작

+0

두 파일의 이름이 정확히 같은 순서입니까? 한 파일의 항목 수가 다른 항목보다 적습니까? 여기 엔 몇 개의 항목이 있습니까? 몇 십만 명이나 수백만 명? – Zaid

+0

모두에게 감사드립니다. 이것은 내가 필요한 것입니다. – paul44

답변

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

고마워, 이제는 쓸 필요가 없습니다. –

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");