Используйте Perl-скрипт для анализа файла, затем обновите / etc / hosts - PullRequest
1 голос
/ 17 ноября 2010

Я работаю над последним 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 не будет таким же, я не могу просто сделать прямую замену.

Может кто-нибудь помочь с последним битом, пожалуйста, как я застрял: (

Thankyou!

Ответы [ 2 ]

1 голос
/ 17 ноября 2010

Ваша замена будет выглядеть так:

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#"'
0 голосов
/ 19 декабря 2010

Хорошо, я обновил свой скрипт, чтобы включить редактирование файла и т. Д. Все в одном.Возможно, это не лучший способ сделать это, но это работает:)

#!/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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...