
我需要另一個幫助,那就是繼續從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 網路。
如果我可以放置一個 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 個括號的遞歸,以及,即。這是在裡面使其成為可選的。我不是 Perl 專家,因此毫無疑問有一個更優化的版本。}
[^{}]*
{
}
{(?-2)*}
()?