2017-02-02 9 views
-1

Моего ввода данных заключаются в следующем:Я новичок в TCL.I просто хочу, чтобы извлечь имя интерфейса, предоставляя IP-адрес в TCL и Ожидать с помощью регулярных выражений

 
Interface     IP-Address  OK? Method Status    Protocol 
Embedded-Service-Engine0/0 unassigned  YES NVRAM administratively down down  
GigabitEthernet0/0   unassigned  YES NVRAM up     up  
GigabitEthernet0/0.10  10.1.1.1  YES NVRAM up     up  
GigabitEthernet0/0.20  20.1.1.2  YES NVRAM up     up  
GigabitEthernet0/1   192.168.2.1 YES NVRAM up     up  
GigabitEthernet0/2   192.168.1.1 YES NVRAM up     up 

Я хочу способ извлечения имен интерфейсов Дано IP адрес. Например, если входной сигнал 192.168.1.1, выход должен быть GigabitEthernet0/2

Может кто-нибудь мне помочь? Я попытался это:

regexp -line -- ^.*?(?=(?:\\..*?)?\\s$ip) $input 

ответ

1

К самому простому способу решить такую ​​вещь в целом, чтобы разобрать строки, чтобы сделать какое-то отображение, вероятно, в массиве, а затем, чтобы сделать поиск в том, что , Для анализа данных мы будем использовать regexp -all -line -inline; это очень полезная комбинация, так как она производит списки, которые мы можем обрабатывать с помощью foreach, чтобы сделать нашу карту.

# You might read this data from another program or from a file; that's good too... 
set data "Interface     IP-Address  OK? Method Status    Protocol 
Embedded-Service-Engine0/0 unassigned  YES NVRAM administratively down down  
GigabitEthernet0/0   unassigned  YES NVRAM up     up  
GigabitEthernet0/0.10  10.1.1.1  YES NVRAM up     up  
GigabitEthernet0/0.20  20.1.1.2  YES NVRAM up     up  
GigabitEthernet0/1   192.168.2.1 YES NVRAM up     up  
GigabitEthernet0/2   192.168.1.1 YES NVRAM up     up " 

# Build the mapping; the “-” in the variable name list is for skipping some unwanted stuff 
foreach {- interface ip} [regexp -all -line -inline {^(\w+/\d+)\s+([\d.]+)} $data] { 
    set mapToIP($interface) $ip 
    set mapToInterface($ip) $interface 
} 

Тогда мы можем только сделать поиск легко всякий раз, когда мы хотим:

set myIP 192.168.1.1 
puts "$myIP is mapped to interface: $mapToInterface($myIP)" 

FWIW, вы действительно нужно, чтобы убедиться, что вы всегда ставили УЭ в фигурные скобки, так как он избегает всех видов проблемы. Хотя это не правило 100%, что вы всегда должны привязывать свои RE, вы должны делать это так или иначе, пока вы не сможете избежать создания RE из отдельных частей во время выполнения, что довольно редко встречается в практическом коде.