1

私はページジェントルーターの出力を持っています

set pagent_ouput "Interface:    Ethernet2/3

packetfilter:   2500 123bps 456.123pps
packetfilter:   2300 345bps 345.548pps

Interface:    Ethernet3/4

packetfilter:   2500 123bps 896.163pps
packetfilter:   2300 345bps 675.748pps"

イーサネット インターフェイスはさまざまです....各イーサネット インターフェイスの pps 値を抽出したいのですが、次のようなものが必要です { {456.123 345.548} {896.163 675.748}}

pagent_output が次のように変化する場合

set pagent_output "Interface:    Ethernet2/3

packetfilter:   2500 123bps 456.123pps
packetfilter:   2300 345bps 345.548pps
packetfilter:   2300 645bps 445.548pps
packetfilter:   2300 745bps 545.548pps

Interface:    Ethernet3/4

packetfilter:   2500 123bps 656.123pps
packetfilter:   2300 345bps 745.548pps
packetfilter:   2300 345bps 845.548pps
packetfilter:   2300 345bps 945.548pps

Interface:    Ethernet3/5

packetfilter:   2500 123bps 156.123pps
packetfilter:   2300 345bps 255.548pps
packetfilter:   2300 345bps 375.548pps
packetfilter:   2300 345bps 395.548pps"

the list will be { {456.123 345.548 445.548 545.548} {656.123 745.548 845.548 945.548} 
{156.123 255.548 375.548 395.548}}
4

2 に答える 2

1

まず、テキストを行ごとに分割し、Interface次にそれらの部分からデータを抽出します。(他の方法はありますが、問題をそのように分割する方が簡単です。大きな問題は、1 つの大きな問題ではなく、接続された小さな問題の観点から考える方が簡単だからです。)抽出を行う式; Tcl の正規表現の正確な方言に従うには、関連するマニュアル ページを必ず確認してください。

データを各インターフェイスのセクションに分割するには、Tcllibtextutil::split::splitxのコマンドを使用することをお勧めします。

package require textutil::split

set interface_data [textutil::split::splitx $pagent_output {(?n)^Interface:.*$}]

次に、各インターフェイスのデータから pps 値を取得します。regexpこれには-all -inlineオプションを使用するのが最適なツールです。

set result {}
foreach item [lrange $interface_data 1 end] {
    lappend result [regexp -all -inline {\m[0-9.]+(?=pps)} $item]
}

今、result変数はあなたが求めているものを保持しています。


Tcl 8.6 にアップグレードした場合は、以下を使用することで、これをすべて短時間で実行できますlmap

package require textutil::split

set result [lmap item [lrange [textutil::split::splitx $pagent_output {(?n)^Interface:.*$}] 1 end] {
    regexp -all -inline {\m[0-9.]+(?=pps)} $item
}]

ただし、基本的な考え方は同じです。textutil::split::splitx物事を分割し(手動で行うのは少し面倒なので)regexp -all -inline、ループで情報を抽出します。

于 2013-03-02T15:03:49.293 に答える
0

インターフェイス出力用にciscoルーターから出力を少し抽出しました。これが何かの助けになるかどうかはわかりません。

tcl regexp コマンドが最善の策だと思います。私は tcl の専門家ではありませんが、regexp を使用すると、括弧内の任意のものに一致させることができます。

set output "
packetfilter:   2500 123bps 456.123pps
packetfilter:   2300 345bps 345.548pps
packetfilter:   2300 645bps 445.548pps
packetfilter:   2300 745bps 545.548pps"

foreach line [split $output "\n"] {
set findpps [regexp {bps\s([0-9]+)\.([0-9]+)pps} $line fullmatch sub1 sub2]
if {$findpps == 1} {
puts "Int Eth2/3 PPS output is $sub1.$sub2"
}
}

正規表現が見つかった場合、出力を行に分割します。= 1 になります。sub1 は「123bps」の後の最初の数値で、sub2 は 2 番目の数値です。

cisco land では、すべてのインターフェイスの値が必要な場合は、「exec コマンド」を介してすべてのインターフェイス出力を取得し、その方法ですべてのデータを解析するスクリプトを作成できます。

于 2013-03-01T23:55:58.377 に答える