使用perl脚本解析文件,然后更新/ etc / hosts

时间:2010-11-17 19:51:24

标签: perl

我正在处理最后一个perl脚本来更新我的/ etc / hosts文件,但是我很困惑并且想知道是否有人可以帮忙吗?

我有一个带有IP的文本文件,需要让我的perl脚本读取这个,这已经完成,但现在我仍然坚持更新/ etc / hosts文件。

到目前为止我的脚本是:

#!/usr/bin/perl

use strict;
my $ip_to_update;

$ip_to_update = `cat /web_root/ip_update/ip_update.txt | awk {'print \$5'}` ;

print "ip = $ip_to_update";

然后我需要在/ etc / hosts中找到一个条目,如

remote.host.tld 192.168.0.20

所以我知道我需要解析它为remote.host.tld,然后替换第二位,但因为ip不会相同我不能直接替换。

任何人都可以帮助最后一点,因为我卡住了:(

三江源!

2 个答案:

答案 0 :(得分:1)

您的替换将如下所示:

s#^.*\s(remote\.host\.tld)\s*$#$ip_to_update\t$1#

替换可以在一行中完成:

perl -i -wpe "BEGIN{$ip=`awk {'print \$5'} /web_root/ip_update/ip_update.txt`} s#^.*\s(remote\.host\.tld)\s*$#$ip\t$1#"'

答案 1 :(得分:0)

好的,我更新了我的脚本以包含文件编辑等所有内容。可能不是最好的方法,但它有效:)

#!/usr/bin/perl

use strict;
use File::Copy;
my $ip_to_update;           # IP from file
my $fh_r;                  # File handler for reading
my $fh_w;                  # File handler for writing
my $file_read = "/etc/hosts";       # File to read in
my $file_write = "/etc/hosts.new";  # File to write out
my $file_backup = "/etc/hosts.bak"; # File to copy original to

# Awks the IP from text file
$ip_to_update = `/bin/awk < /web_root/ip_update/ip_update.txt {'print \$5'}` ;

# Open File Handlers
open( $fh_r, '<', $file_read ) or die "Can't open $file_read: $!";
open( $fh_w, '>', $file_write ) or die "Can't open $file_write: $!";

while ( my $line = <$fh_r> )
{
        if ( $line =~ /remote.host.tld/ ) 
    {
                #print $fh_w "# $line";
        }
    else
    {
        print $fh_w "$line";
    }
    }

chomp($ip_to_update);           # Remove newlines
print $fh_w "$ip_to_update          remote.host.tld\n";
        # Prints out new line with new ip and hostname

# Close file handers
close $fh_r;
    close $fh_w;

move("$file_read","$file_backup");  # Moves original file to .bak
move("$file_write","$file_read");   # Moves new file to original file loaction