LINUX.ORG.RU

Создание именных файлов и запись данных

 , ,


0

2

Добрый день! Подскажите пожалуйста по моему вопросу. Суть вот в чем. Имеется программа. Ее код;


#!/usr/bin/perl -w
 
use strict;
use FindBin;
 
my $base_dir = "$FindBin::Bin";
my $file_name = "$base_dir/source.dat";
my %interfaces;
my @current_nets;
 
open(SRC, "< $file_name") || die "Файл не найден!";
while (my $s = <SRC>) {
    chomp $s;
    next if $s =~ /^\s*$/ || $s =~ /^\s*#/;    
    # Проверяем, похожа ли строка на ключ=значение
    if ($s =~ /^(.+?)\s*=\s*(.+)$/) {
      # Да, похожа
      ParseKeyValue($1, $2);
      next;
    }
    # Вызов процедуры проверки на начало сети 
    if ($s =~ /^\[(\S+)\]/) {
      ParseNetName($1);
      next;
    }
    
}
 
close SRC;
 
exit;
 
 
# Разобрать строку ключ = значение
sub ParseKeyValue 
{
    my $key = shift;
    my $value = shift;
    # $value разобрать на кусочки
    my $if;
    my $ip;
    if ($value =~ /^([a-zA-Z\d]+)(?:\s+(\d+\.\d+\.\d+\.\d+))?/) {
    $if = $1;
        $ip = $2;
        # Вывести на экран для проверки
        print "interface = $if";
        if ($ip) { print(" ip = $ip"); }
        print "\n";
    } else {
        die "Ошибка разбора на кусочки\n";
    }
    # Кусочки занести в хеш
    $interfaces{$1} = \{if => $1, ip => $2};
}    
 
# Процедура проверки на начало сети
sub ParseNetName 
{
    my $net = shift;
    @current_nets = split(/\|/, $net);
}
 
    


Так же имеется файл с данными откуда программа берет необходимые строки и сохраняет их
Содержимое файла source_1.dat.

in = em1
out = p2p1
mslink = em2 192.168.188.12
vpn = p2p2 192.168.195.112
dmz = p2p3 192.168.166.112
mci = p2p4

[in]


201.201.201.0/24 122.190.192.193
162.198.210.0/24 122.60.194.193

[mslink]

192.168.168.130

[dmz]
192.192.192.192/255.255.255.192
192.192.192.192.16

[mci]
172.22.0.0/16 172.22.11.105

[mslink|vpn]

101.200.192.0/16

201.192.180.0/16


192.192.192.0/16

Так вот нужно дописать код так, чтобы создавался новый файл с названием имени сети и туда записывались бы те адреса что идут под именем сети. К примеру создается файл mci его содержимое 172.22.0.0/16 172.22.11.105 и т.д.

Ответ на: комментарий от Deleted

в ручную не ставил, не знаю почему он новую строку так обозначил

sis_privet ()
Ответ на: комментарий от sis_privet

не, текст из последнего файла вытащи. И звёздочки убери нах. Или они нужны? Вообще, не ленись, сделай все как надо. Чтоб не поленились для тебя.

Deleted ()
Ответ на: комментарий от Deleted

Поправил. А что если сначала занести в хеш где ключ(это имя интерфейса) а значение(массив из маршрутов(адресов))

sis_privet ()
#!/usr/bin/perl -ln
BEGIN { $rx = qr/^(\b[0-9\.\/\s]+\b)$/ }

$section = $1 if /^\s*\[(.*)\]$/;
if (index $section, '|') {
    if (/$rx/) {
        push @{$h{$_}}, $& for split /\|/, $section
    }
} else {push @{$h{$section}}, $& if /$rx/}
}{
    for $f (keys %h) {
        open  LOG, "> $f";
        print LOG for values @{$h{$f}};
        close LOG;
    }
$ chmod +x script.pl
$ script.pl source_1.dat
$ for f in mslink mci in dmz; do echo [$f]; cat $f; done
[mslink]
192.168.168.130
101.200.192.0/16
201.192.180.0/16
192.192.192.0/16
[mci]
172.22.0.0/16 172.22.11.105
[vpn]
101.200.192.0/16
201.192.180.0/16
192.192.192.0/16
[in]
201.201.201.0/24 122.190.192.193
162.198.210.0/24 122.60.194.193
[dmz]
192.192.192.192/255.255.255.192
192.192.192.192.16
Deleted ()
Ответ на: комментарий от Deleted

Все классно, допустим мы не знаем имена сетей? Можно как то реализовать, чтобы програма сама подхватывала имена сетей и их адреса и писала в отдельный файл?

sis_privet ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.