awk或perl文件编辑&操作

时间:2010-04-09 11:03:05

标签: perl awk

我有一个标准的passwd文件&用户地图文件 - 以以下格式映射unix名称(例如jbloggs)和AD帐户名称(例如bloggsjoe):
    jbloggs bloggsjoe
    jsmith smithjohn
......等 如何编辑passwd文件以将原始unix名称与AD帐户名交换,因此passwd文件的每一行都有AD帐户名。
感谢perl学习者的任何帮助。

4 个答案:

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

答案 1 :(得分: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");

答案 2 :(得分:0)

这是一个很难做的事情

$ 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

答案 3 :(得分:0)

使用Passwd::Unix。它将为/ etc / passwd,/ etc / shadow和/ etc / group coordinate the editing。在尝试编辑之前,请务必备份这些文件。