2013-03-01 51 views
1

特定值我有一個PAGENT路由器輸出作爲提取輸出

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

回答

1

首先,您需要將文本分成Interface行,然後您想要從這些段中提取數據。 (即使有其他方法來解決這個問題也很容易,因爲考慮到更小的問題而不是一個大問題,更容易考慮更大的問題。)我們將使用常規表達式來進行提取;要遵循Tcl確切的RE方言,一定要檢查relevant manual page

要將數據拆分爲每個接口的部分,我推薦使用中的textutil::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變量保存你所追求的。


如果您已升級到8.6的Tcl,你可以通過使用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在一個循環中提取信息。

+1

請注意,「textutil :: split :: splitx」的實現本身是純粹的Tcl並且處於許可(BSD-ish)許可下。如果您需要進行部署,則可以複製代碼並使用它。 – 2013-03-02 15:05:11

+0

謝謝(textutil :: split :: splitx)我在找什麼,proc在腳本中使用非常簡單..謝謝Donal – 2013-03-08 09:05:19

0

我已經做了一點從cisco路由器提取輸出爲inter臉部輸出。 不知道這是什麼幫助。

tcl regexp命令是我認爲你最好的選擇。我不是tcl的專家,但使用正則表達式,你可以匹配任何你想要的內容。

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是第二數量

思科土地,如果你想所有接口的值可以編寫一個腳本,通過「exec命令」獲取所有接口輸出,並通過所有數據解析。

+0

matt,我的問題是每個以太網接口我想在單獨的列表中的pps值....如果有30個以太網接口每個具有20 pps值,那麼我想要一個30個元素的列表(foreach以太網接口)和每個列表元素本身的另一個列表0f 20列表元素(pps值) – 2013-03-02 04:03:54