從TCL中的多個嵌套括號中提取數據

從TCL中的多個嵌套括號中提取數據

我需要另一個幫助,那就是繼續從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 vlaninterfaces和後面的區塊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)*}()?

相關內容