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,然后从这些块中提取数据。(即使有其他方法可以做到这一点,这种方式更容易分解问题,因为从连接的小问题而不是一个大问题的角度来考虑更大的问题更容易。)我们将使用常规进行提取的表达式;要遵循 Tcl 的准确 REs 方言,请务必查看相关手册页

要将数据拆分为每个接口的部分,我建议使用textutil::split::splitx来自Tcllib的命令。

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 方面的专家,但是使用正则表达式,您可以匹配括号中的任何内容。

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 是第二个数字

在 cisco 领域,如果您想要所有接口的值,您可以编写一个脚本,通过“exec 命令”获取所有接口输出,并以这种方式解析所有数据。

于 2013-03-01T23:55:58.377 回答