
Мне нужна еще одна помощь, это в продолжениеИзвлечение данных из вложенных скобок в bash,
У меня есть входные данные, как показано ниже, с несколькими блоками. Я хочу реализовать логику для проверки только блока сетевых VLAN, исключив блоки аутентификации, сетевого транка и сетевого интерфейса.
auths remote {
roles {
admin {
role administrator
}
readonly {
role read-only
}
}
}
auths ldap system {
login-attribute uid
port 636
}
network vlan internal-vlan {
description "internal-use"
interfaces {
1.1 { }
1.2 { }
}
MTU {
1500
}
}
network vlan external-vlan {
description "external-use"
interfaces {
2.1 { }
2.2 { }
}
MTU {
1500
}
}
network vlan dummy-vlan {
description "dummy-use"
interfaces {
1.1 { }
}
}
network trunk {
description "none"
}
network interface 1.1 {
Status {
UP
}
}
network interface 1.2 {
Status {
UP
}
}
network interface 2.1 {
Status {
DOWN
}
}
network interface 2.2 {
Status {
UP
}
}
system update settings {
frequency monthly
}
Я хочу получить такой же вывод, как и раньше. Думаю, мне нужно создать родительскую функцию и добавить логику if для проверки того, начинается ли блок с "network vlan", а затем запустить proc network.
Если я могу применить логику if для проверки строки «network vlan», а затем запустить процедуру, я думаю, что смогу применить ее к остальным конфигурациям и создать новые функции везде, где это необходимо.
решение1
Поскольку ваш последний вопрос касался решений на Perl, вот одно из них, которое довольно простое, за исключением рекурсивного регулярного выражения, необходимого для сопоставления вложенных {...}
блоков, которое я выделил в переменную $balanced
. Это также позволяет использовать его 3 раза, один раз для сопоставления блока после каждого из ключевых слов network vlan
, interfaces
, и MTU
.
#!/usr/bin/perl
use strict;
open(F,"datafile") or die;
my $data = join("",<F>);
my $balanced = qr/
( ( [^{}]*+
({ (?-2)* })?
)*
)/x;
while($data =~ m/network\s+vlan\s+([^ {]+)\s*{$balanced}/g){
my $vlan = $1;
my $body = $2;
$body =~ m/description\s*("[^\"]*")/;
my $desc = $1;
$body =~ m/interfaces\s*{$balanced}/;
my $intf = $1;
$intf =~ s/\s+/ /g;
my $mtu = 'none';
$mtu = $1 if($body =~ m/MTU\s*{$balanced}/);
$mtu =~ s/\s+/ /g;
print "$vlan, $desc,$intf,$mtu\n";
}
$balanced
используется после того, как вы сопоставили открытие {
блока, и продолжает сопоставлять все, что не является {
или }
с помощью [^{}]*
. За этим необязательно следует {
, рекурсия, возвращающаяся на 2 скобки назад, и }
, а именно {(?-2)*}
. Это внутри, ()?
чтобы сделать его необязательным. Я не эксперт по Perl, поэтому, несомненно, есть более оптимальная версия этого.