2

У меня есть список из более чем 200 файлов расширений связывания с точной информацией о поддомене.

Пример схемы выглядит следующим образом.

# /named_ext/db.mysite.com
subdomain                    A       200.201.202.203

Мне нужно заменить всю строку на набор из трех разных строк, это нравится.

subdomain                    A       200.201.202.204
subdomain                    A       200.201.202.205
subdomain                    A       200.201.202.206

Любая идея, как выполнить такую замену во всех /named_ext/ файлах?

3 ответа3

2

Вы можете использовать следующий скрипт perl exchange_ips.pl для обмена ip либо тремя постоянными ips (функция exchange_const()), либо тремя инкрементными ips (функция exchange_incr()). Просто добавьте комментарий (#) перед вызовом функции в конце скрипта, который вам не нужен.

Обратите внимание, что один или несколько инкрементальных ips будут неправильными, если исходный ip заканчивается 253 или выше.

Скрипт изменяет все строки, начиная с $domainname . Если доменное имя не имеет значения, или если ваши файлы содержат строки только для одного / того же домена, установите my $domainname = ".+"; ,

#!/usr/bin/perl

use strict;
use warnings;

my @data = <STDIN>;

my $domainname = "subdomain";
my $const_ip1 = "123.123.123.123";
my $const_ip2 = "124.124.124.124";
my $const_ip3 = "125.125.125.125";

my $pattern = qr/^($domainname\s+A\s+)([\d\.]+)/is;

sub exchange_const($) {
    my $dataref = shift;
    my $found = 0;
    foreach (@$dataref) {
        if ($_ =~ m/$pattern/) {
            unless ($found) {
                $found = 1;
                printf "%s%s\n%s%s\n%s%s\n", $1, $const_ip1, $1, $const_ip2, $1, $const_ip3;
            }
        } else {
            print $_;
        }
    }
}

sub exchange_incr($) {
    my $dataref = shift;
    my $found = 0;
    foreach (@$dataref) {
        if ($_ =~ m/$pattern/) {
            unless ($found) {
                $found = 1;
                my $const = $1;
                my @iparr = split /\./, $2;
                for (1 .. 3) {
                    $iparr[3]++;
                    printf "%s%s\n", $const, join ".", @iparr;
                }
            }
        } else {
            print $_;
        }
    }
}

# exchange ip with constant ips
exchange_const(\@data);

# exchange ip with incremental ips
exchange_incr(\@data);

Назовите сценарий так:

perl exchange_ips.pl < your_file

Цикл по всем файлам (с резервной копией):

for f in /named_ext/*; do rename s/$/.bak/ $f; perl exchange_ips.pl < $f.bak > $f; done

Пример:

Пример файла для модификации:

# some foo
subdomain                       A       200.201.202.203
# duplicate
subdomain                       A       200.201.202.203
# some bar
otherdomain                     A       99.99.99.99
otherdomain                     A       1.1.1.1
# another duplicate
subdomain                       A       200.201.202.203

Вывод exchange_const():

# some foo
subdomain                       A       123.123.123.123
subdomain                       A       124.124.124.124
subdomain                       A       125.125.125.125
# duplicate
# some bar
otherdomain                     A       99.99.99.99
otherdomain                     A       1.1.1.1
# another duplicate

Вывод exchange_incr():

# some foo
subdomain                       A       200.201.202.204
subdomain                       A       200.201.202.205
subdomain                       A       200.201.202.206
# duplicate
# some bar
otherdomain                     A       99.99.99.99
otherdomain                     A       1.1.1.1
# another duplicate
2

Небольшой скрипт bash

Вы можете сделать это с помощью простой команды sed каждого файла:

for f in ./named_ext/* ; do
    sed -r -i 's/subdomain[ ]+A[ ]+200.201.202.203/subdomain A 200.201.202.204\nsubdomain A 200.201.202.205\nsubdomain A 200.201.202.206/g' $f
done

объяснение

Цикл for перечисляет ./named_ext/* и запускает строку sed используя файл $f . -r расширит регулярный экспресс, а -i отредактирует файл на месте.

Регулярное выражение заменяет

subdomain                    A       200.201.202.203

с любым количеством пробелов по

subdomain A 200.201.202.204
subdomain A 200.201.202.205
subdomain A 200.201.202.206

Если вы хотите сохранить интервал, вы можете добавить пробелы в строке sed .

1
#!/bin/bash

tempFile=tempFile

for f in /named_ext/* ; do
    awk '
    BEGIN {FS = OFS = "."}

    /[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/ {
        for (i=0; i<3; i++) {
            $4++
            print $0
        }
    }' $f > $tempFile
    mv $tempFile $f
done

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .