2013-03-01 2 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" 

Ethernet интерфейсы меняется .... я хочу, чтобы извлечь значение 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 REs, обязательно проверьте relevant manual page.

Чтобы разделить данные на разделы для каждого интерфейса, я рекомендую использовать команду 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 в цикле для извлечения информации.

+1

Обратите внимание, что реализация 'textutil :: split :: splitx' сама по себе является чистым Tcl и под разрешающей (BSD-ish) лицензией.Если вам нужно для развертывания, вы можете просто скопировать код и использовать его. –

+0

Спасибо этому (textutil :: split :: splitx), что именно я ищу., Proc настолько прост в использовании в скриптах. –

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

матовый, моя проблема для каждого интерфейса ethernet. Я хочу значение pps в отдельном списке .... если есть 30 интерфейсов Ethernet, каждый из которых имеет 20 pps, тогда я хочу иметь список из 30 элементов (интерфейс ethernet ethernet) и каждый элемент списка сам по себе еще один элемент списка 0f 20 (значения pps) –

Смежные вопросы