Bashのネストされた括弧からデータを抽出する

Bashのネストされた括弧からデータを抽出する

一部のデータを抽出し、レビューと移行のためにファイルに保存する方法が必要です。これは私のデータです。

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
    }
}

次のように、表形式でVLAN名と説明、インターフェイスの詳細を抽出する必要があります。 bashスクリプトまたはPerlを使用してこのデータファイルを実行できる場合は、csvファイルで出力を生成してレビュー用に開くことができます。

ここに画像の説明を入力してください。

入力データと要件を更新してください(申し訳ありません)。MTU列の値をNoneに設定したいので、MTUなしの仮想VLANがある場合

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 interface 1.1 {
    Status {
        UP
    }
}
network interface 1.2 {
    Status {
        UP
    }
}
network interface 2.1 {
    Status {
        DOWN
    }
}
network interface 2.2 {
    Status {
        UP
    }
}

ここに画像の説明を入力してください。

ベストアンサー1

これは本当に活用に最適です。タリウム- データは有効なTcl構文であるため、関数を定義するだけでnetwork有効なDSLがあります。

#!/usr/bin/env tclsh

proc network {_ name data} {
    set values [lmap val [concat $name [dict values $data]] {
        format {"%s"} [regsub -all {\s+} [string trim $val] " "]
    }]
    puts [join $values ,]
}

puts {"Vlan","Description","Interfaces","MTU"}
source [lindex $argv 0]

それから

$ tclsh parse.tcl datafile
"Vlan","Description","Interfaces","MTU"
"internal-vlan","internal-use","1.1 { } 1.2 { }","1500"
"external-vlan","external-use","2.1 { } 2.2 { }","1500"

またはインストールtcllibCSV出力を処理するようにします。

#!/usr/bin/env tclsh
package require csv

proc network {_ name data} {
    puts [csv::join [lmap val [concat $name [dict values $data]] {
        regsub -all {\s+} [string trim $val] " "
    }]]
}

puts [csv::join {Vlan Description Interfaces MTU}]
source [lindex $argv 0]
$ tclsh parse.tcl datafile
Vlan,Description,Interfaces,MTU
internal-vlan,internal-use,1.1 { } 1.2 { },1500
external-vlan,external-use,2.1 { } 2.2 { },1500

以前のTcl 8.5バージョンの場合は、プログラムの上部に次の手順を追加してください。

proc lmap {varname list body} {
    upvar 1 $varname element
    set result {}
    foreach element $list {
        lappend result [uplevel 1 $body]
    }
    return $result
}

さまざまな種類のネットワークと「なし」の値を処理し、フィールドの順序が正しいことを確認してください。

proc network {type name data} {
    if {$type ne "vlan"} {
        return
    }
    set values [list $name]
    foreach key {description interfaces MTU} {
        set val [expr {[dict exists $data $key] ? [dict get $data $key] : "none"}]
        lappend values [regsub -all {\s+} [string trim $val] " "]
    }
    puts [join $values ,]
}

おすすめ記事