
Necesito otra ayuda, esto es una continuación deExtraer datos del paréntesis anidado en bash,
Tengo datos de entrada como los que se muestran a continuación con múltiples bloques, quiero poner una lógica para verificar solo el bloque VLAN de red, excluir las autorizaciones, el tronco de red y los bloques de interfaz de red.
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
}
Quiero un resultado similar al anterior. Creo que tengo que crear una función principal y poner una lógica if para verificar si el bloque comienza con "red vlan" y luego activar la red proc.
Si puedo poner una lógica if para verificar la cadena "red vlan" y luego activar un proceso, creo que puedo relacionarme con el resto de las configuraciones y crear nuevas funciones cuando sea necesario.
Respuesta1
Dado que su última pregunta pedía soluciones de Perl, aquí hay una que es bastante simple, excepto por la expresión regular recursiva necesaria para hacer coincidir {...}
bloques anidados, que he separado en la variable $balanced
. Esto también permite usarlo 3 veces, una vez para hacer coincidir el bloque después de cada una de las palabras clave network vlan
, interfaces
y 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
se usa una vez que ha hecho coincidir la apertura {
de un bloque, y continúa para hacer coincidir cualquier cosa que no lo sea {
o }
usando [^{}]*
. Opcionalmente, esto va seguido de {
, la recursividad retrocede 2 paréntesis y }
, es decir {(?-2)*}
. Esto está adentro ()?
para que sea opcional. No soy un experto en Perl, por lo que sin duda existe una versión más óptima de esto.