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