2013-03-07 1 views
-1

содержание expect_out(buffer)соответствие шаблону и обработка данных в ожидании?

GigabitEthernet1/0/9 unassigned  YES unset up     up 
GigabitEthernet1/0/10 unassigned  YES unset down     down 
GigabitEthernet1/0/11 unassigned  YES unset down     down 
GigabitEthernet1/0/23 unassigned  YES unset down     down 
GigabitEthernet1/0/24 unassigned  YES unset down     down 
GigabitEthernet1/1/1 unassigned  YES unset down     down 
GigabitEthernet1/1/2 unassigned  YES unset down     down 
GigabitEthernet1/1/3 unassigned  YES unset down     down 
GigabitEthernet1/1/4 unassigned  YES unset down     down 
Te1/1/1    unassigned  YES unset down     down 
Te1/1/2    unassigned  YES unset down     down 
FastEthernet2/0/1  unassigned  YES unset down     down 
FastEthernet2/0/2  unassigned  YES unset down     down 
FastEthernet2/0/24  unassigned  YES unset down     down 
GigabitEthernet2/0/1 unassigned  YES unset up     up 
GigabitEthernet2/0/2 unassigned  YES unset down     down 

У меня есть данные foloowing выше, и мне нужно подсчитать количество данных для каждого типа , так что я могу иметь информацию, как:

GigabitEthernet1 : 20 
GigabitEthernet2 : 20 
Tel    : 2 
FastEthernet2 : 4 
FastEthernet1 : 4 

всего: 50

Как я могу это сделать? Любая помощь будет оценена по достоинству, потому что я не знаю, в каком направлении двигаться дальше, потому что я новичок, насколько это ожидалось/tcl.

Я попытался использовать функцию разделения для ее синтаксического анализа с использованием новой строки в качестве разделителя, так что я могу использовать регулярное выражение внутри цикла, но кажется, что поскольку $ expect_output (buffer) является переменной, он может не иметь никаких строк в нем.

Кроме того, я могу использовать awk или sed внутри, ожидая, тогда это будет не так сложно, я думаю. Но ожидаемое решение будет стандартным.

+0

Почему 'GigabitEthernet2: 20'? Я вижу только два из них на вашем входе. – Kent

+0

жаль, что данные были большими, поэтому я взял его, я просто дал это как пример – munish

ответ

2

на основе текущих входных данных, это один вкладыш:

awk -F'/' '{a[$1]++}END{for(x in a){print x" : "a[x];t+=a[x];}print "total : "t}' file 

дает:

FastEthernet2 : 3 
GigabitEthernet1 : 9 
GigabitEthernet2 : 2 
Te1 : 2 
total : 16 
+0

спасибо, @ Kent, но все же я надеюсь, что кто-то будет вести меня в этом, используя ожидание, чтобы мой полный код ожидал, но если бы мог использовать этот в ожидании скрипта как-то было бы здорово :-). Я имею в виду, что мне, возможно, придется установить его (expect_out (buffer)) как переменную окружения, а затем использовать awk для выполнения такой обработки – munish

1

Поскольку Ожидать основан на TCL/TK вы должны ознакомиться с этим языком, так как он содержит множество вариантов обработки строк. Вот какой код, который, надеюсь, поставит вас на правильный путь.

set str $expect_out(buffer) 
# Strip everything after slash 
regsub -all -line "/.*" $str "" str2 

puts $str2 # just to see what you got so far 

# Convert string into list 
set li [split $str2 "\n"] 

# Convert list into array 
# This is actually the tricky part which converts the list into an 
# associative array whose entries have first to be set to one 
# and later have to be increased by one 
for {set i 0} {$i < [llength $li]} {incr i} { 
    if { [info exists arr([lindex $li $i]) ] } { 
    incr arr([lindex $li $i]) } { 
    set arr([lindex $li $i]) 1 } 
} 

# Now get the statistics 
array get arr 

# will print this for your example 
# GigabitEthernet2 2 Te1 2 FastEthernet2 3 GigabitEthernet1 9 

И вы должны пометить этот вопрос Tcl и TK тоже.

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