-1

これは私が持っている構成であり、これを Cisco ASA に貼り付けることができる単一のルート コマンドに統合しようとしています。

set device "internal"
set dst 13.13.13.13 255.255.255.255
set gateway 172.16.1.1

set device "internal"
set dst 14.14.14.14 255.255.255.255
set gateway 172.16.1.1

set device "internal"
set dst 15.15.15.15 255.255.255.255
set gateway 172.16.1.1

それを単一のデバイスに結合し、それに応じて変更して、次のようにします

route internal 13.13.13.13 255.255.255.255 172.161.1.1

その後、他の 3 行は消えます。

ソース構成の他の部分を実行するために他のスクリプトを作成しているので、Perl でこれを実行したいと思います。

4

3 に答える 3

0

クイックハック。これにより、一連の値(2つの連続する改行で区切られます)が読み込まれ、ハッシュに入れられ、そのハッシュが配列にプッシュされます。入力レコード区切り文字を使用してレコード$/を読み取ります。空の文字列に設定$/することは、""に設定することに似てい"\n\n"ます。詳細については、上記のリンク先のドキュメントを参照してください。

ここで何が必要かよくわかりません。1行だけがマージされた場合は、配列にプッシュせずにハッシュを格納するだけです。最初のレコードを「記憶」します。

use strict;
use warnings;

$/ = "";   # paragraph mode
my @sets;
while (<DATA>) {
    my %set;
    chomp;               # this actually removes "\n\n" -- the value of $/
    for (split /\n/) {   # split each record into lines
        my ($set,$what,$value) = split ' ', $_, 3;  # max 3 fields
        $set{$what} //= $value;        # //= means do not overwrite
    }
    $set{device} =~ s/^"|"$//g;        # remove quotes
    push @sets, \%set;
}

for my $set (@sets) {  # each $set is a hash ref
    my $string = join " ", "route", 
        @{$set}{"device","dst","gateway"};  # using hash slice
    print "$string\n";
}

__DATA__
set device "internal"
set dst 13.13.13.13 255.255.255.255
set gateway 172.16.1.1

set device "internal"
set dst 14.14.14.14 255.255.255.255
set gateway 172.16.1.1

set device "internal"
set dst 15.15.15.15 255.255.255.255
set gateway 172.16.1.1

出力:

route internal 13.13.13.13 255.255.255.255 172.16.1.1
route internal 14.14.14.14 255.255.255.255 172.16.1.1
route internal 15.15.15.15 255.255.255.255 172.16.1.1
于 2012-03-08T02:28:46.853 に答える
0

入力が示すように、構成ファイルが空白行で区切られた「段落」(スタンザ) で構成されている場合は、次のようにします。

#!/usr/bin/env perl
use strict;
use warnings;
local $/ = ""; #...paragraph mode...
while (<>) {
    chomp;
    m{^set.+"internal".+dst\s*([\d\.\s]+$).+gateway\s*(.+)$}ms and
        print "route internal $1 $2\n";
}
于 2012-03-07T22:17:49.347 に答える
0

deviceあなたの注文が常に,dstであると仮定するとgateway、これはうまくいきます:

use strict;
use warnings;


my @devices=(); #Array to store device strings
my $current_device=""; #String to capture current device.

while(<DATA>)
{
    chomp;
    if(/^set (\w+) (.+)$/)
    {
        if($1 eq "device")
        {
            $current_device="route $2";
            $current_device=~s/"//g;
        }
        elsif($1 eq "dst")
        {
            $current_device.=" $2";
        }
        elsif($1 eq "gateway")
        {
            $current_device.=" $2";
            push @devices,$current_device;
        }
    }
}

print "$_\n" foreach(@devices);




__DATA__
set device "internal"
set dst 13.13.13.13 255.255.255.255
set gateway 172.16.1.1

set device "internal"
set dst 14.14.14.14 255.255.255.255
set gateway 172.16.1.1

set device "internal"
set dst 15.15.15.15 255.255.255.255
set gateway 172.16.1.1

出力は次のとおりです。

route internal 13.13.13.13 255.255.255.255 172.16.1.1
route internal 14.14.14.14 255.255.255.255 172.16.1.1
route internal 15.15.15.15 255.255.255.255 172.16.1.1
于 2012-03-07T21:59:27.837 に答える