При работе с сетевым оборудованием (и не только), файлами могут быть:
- конфигурации (простые, не структурированные текстовые файлы)
- шаблоны конфигураций
- файлы с параметрами подключений. как правило, это структурированные файлы, в каком-то определенном формате: YAML, JSON, CSV
- другие скрипты Python. Например Модули
В работе с файлами есть несколько аспектов:
- открытие/закрытие
- чтение
- запись
Для открытия файлов, чаще всего, используется функция open:
file = open('file_name.txt', 'r')
В функции open():
- 'file_name.txt' - имя файла. тут можно указывать не только имя, но и путь (абсолютный или относительный)
- 'r' - режим открытия файла
Функция open создает объект file, к которому потом можно применять различные методы, для работы с ним.
Режимы открытия файлов:
В Python есть несколько методов чтения файла:
- read - считывает содержимое файла в строку
- readline - считывает файл построчно
- readlines - считывает строки файла и создает список из строк
Посмотрим как считывать содержимое файлов, на примере файла r1.txt:
! service timestamps debug datetime msec localtime show-timezone year service timestamps log datetime msec localtime show-timezone year service password-encryption service sequence-numbers ! no ip domain lookup ! ip ssh version 2 !
Метод read - считывает весь файл в одну строку.
Пример использования метода read:
In [1]: f = open('r1.txt') In [2]: f.read() Out[2]: '!\nservice timestamps debug datetime msec localtime show-timezone year\nservice timestamps log datetime msec localtime show-timezone year\nservice password-encryption\nservice sequence-numbers\n!\nno ip domain lookup\n!\nip ssh version 2\n!\n' In [3]: f.read() Out[3]: ''
При повторном чтении файла в 3 строке, отображается пустая строка. Так происходит из-за того, что при вызове метода read, считывается весь файл. И после того, как файл был считан, курсор остается в конце файла. Управлять положением курсора можно с помощью метода seek.
Построчно файл можно считать с помощью метода readline:
In [4]: f = open('r1.txt') In [5]: f.readline() Out[5]: '!\n' In [6]: f.readline() Out[6]: 'service timestamps debug datetime msec localtime show-timezone year\n'
Но чаще всего проще пройтись по объекту file в цикле, не используя методы read...:
In [7]: f = open('r1.txt') In [8]: for line in f: ...: print(line) ...: ! service timestamps debug datetime msec localtime show-timezone year service timestamps log datetime msec localtime show-timezone year service password-encryption service sequence-numbers ! no ip domain lookup ! ip ssh version 2 !
Еще один полезный метод - readlines. Он считывает строки файла в список:
In [9]: f = open('r1.txt') In [10]: f.readlines() Out[10]: ['!\n', 'service timestamps debug datetime msec localtime show-timezone year\n', 'service timestamps log datetime msec localtime show-timezone year\n', 'service password-encryption\n', 'service sequence-numbers\n', '!\n', 'no ip domain lookup\n', '!\n', 'ip ssh version 2\n', '!\n']
Если нужно получить строки файла, но без перевода строки в конце, можно воспользоваться методом split и как разделитель, указать символ \n:
In [11]: f = open('r1.txt') In [12]: f.read().split('\n') Out[12]: ['!', 'service timestamps debug datetime msec localtime show-timezone year', 'service timestamps log datetime msec localtime show-timezone year', 'service password-encryption', 'service sequence-numbers', '!', 'no ip domain lookup', '!', 'ip ssh version 2', '!', '']
Обратите внимание, что последний элемент списка - пустая строка.
Если перед выполнением split, воспользоваться методом rstrip, список будет без пустой строки в конце:
In [13]: f = open('r1.txt') In [14]: f.read().rstrip().split('\n') Out[14]: ['!', 'service timestamps debug datetime msec localtime show-timezone year', 'service timestamps log datetime msec localtime show-timezone year', 'service password-encryption', 'service sequence-numbers', '!', 'no ip domain lookup', '!', 'ip ssh version 2', '!']
До сих пор, файл каждый раз приходилось открывать заново, чтобы снова его считать. Так происходит из-за того, что после методов чтения, курсор находится в конце файла. И повторное чтение возвращает пустую строку.
Чтобы ещё раз считать информацию из файла, нужно воспользоваться методом seek, который перемещает курсор в необходимое положение.
Пример открытия файла и считывания содержимого:
In [15]: f = open('r1.txt') In [16]: print(f.read()) ! service timestamps debug datetime msec localtime show-timezone year service timestamps log datetime msec localtime show-timezone year service password-encryption service sequence-numbers ! no ip domain lookup ! ip ssh version 2 ! In [17]: print(f.read()) Out[17]: '' In [18]: f.seek(0) In [19]: print(f.read()) ! service timestamps debug datetime msec localtime show-timezone year service timestamps log datetime msec localtime show-timezone year service password-encryption service sequence-numbers ! no ip domain lookup ! ip ssh version 2 !
При записи, очень важно определиться с режимом открытия файла, чтобы случайно его не удалить:
- w - открыть файл для записи. Если файл существует, то его содержимое удаляется
- a - открыть файл для дополнения записи. Данные добавляются в конец файла
При этом оба режима создают файл, если он не существует.
Для записи в файл используются такие методы:
- write - записать в файл одну строку
- writelines - позволяет передавать в качестве аргумента список строк
Метод write ожидает строку, для записи.
Для примера, возьмем список строк с конфигурацией:
In [1]: cfg_lines = ['!', ...: 'service timestamps debug datetime msec localtime show-timezone year', ...: 'service timestamps log datetime msec localtime show-timezone year', ...: 'service password-encryption', ...: 'service sequence-numbers', ...: '!', ...: 'no ip domain lookup', ...: '!', ...: 'ip ssh version 2', ...: '!']
Открытие файла r2.txt в режиме для записи:
In [2]: f = open('r2.txt', 'w')
Преобразуем список команд в одну большую строку с помощью join:
In [3]: cfg_lines_as_string = '\n'.join(cfg_lines) In [4]: cfg_lines_as_string Out[4]: '!\nservice timestamps debug datetime msec localtime show-timezone year\nservice timestamps log datetime msec localtime show-timezone year\nservice password-encryption\nservice sequence-numbers\n!\nno ip domain lookup\n!\nip ssh version 2\n!'
Запись строки в файл:
In [5]: f.write(cfg_lines_as_string)
Аналогично можно добавить строку вручную:
In [6]: f.write('\nhostname r2')
После завершения работы с файлом, его необходимо закрыть:
In [7]: f.close()
Так как ipython поддерживает команду cat, можно легко посмотреть содержимое файла:
In [8]: cat r2.txt ! service timestamps debug datetime msec localtime show-timezone year service timestamps log datetime msec localtime show-timezone year service password-encryption service sequence-numbers ! no ip domain lookup ! ip ssh version 2 ! hostname r2
Метод writelines ожидает список строк, как аргумент.
Запись списка строк cfg_lines в файл:
In [1]: cfg_lines = ['!', ...: 'service timestamps debug datetime msec localtime show-timezone year', ...: 'service timestamps log datetime msec localtime show-timezone year', ...: 'service password-encryption', ...: 'service sequence-numbers', ...: '!', ...: 'no ip domain lookup', ...: '!', ...: 'ip ssh version 2', ...: '!'] In [9]: f = open('r2.txt', 'w') In [10]: f.writelines(cfg_lines) In [11]: f.close() In [12]: cat r2.txt !service timestamps debug datetime msec localtime show-timezone yearservice timestamps log datetime msec localtime show-timezone yearservice password-encryptionservice sequence-numbers!no ip domain lookup!ip ssh version 2!
В результате все строки из списка записались в одну строку файла, так как в конце строк не было символа \n.
Добавить перевод строки можно по-разному. Например, можно просто обработать список в цикле:
In [13]: cfg_lines2 = [] In [14]: for line in cfg_lines: ....: cfg_lines2.append(line + '\n') ....: In [15]: cfg_lines2 Out[15]: ['!\n', 'service timestamps debug datetime msec localtime show-timezone year\n', 'service timestamps log datetime msec localtime show-timezone year\n', 'service password-encryption\n', 'service sequence-numbers\n', '!\n', 'no ip domain lookup\n', '!\n', 'ip ssh version 2\n',
Если итоговый список записать заново в файл, то в нём уже будут переводы строк:
In [18]: f = open('r2.txt', 'w') In [19]: f.writelines(cfg_lines2) In [20]: f.close() In [21]: cat r2.txt ! service timestamps debug datetime msec localtime show-timezone year service timestamps log datetime msec localtime show-timezone year service password-encryption service sequence-numbers ! no ip domain lookup ! ip ssh version 2 !
В реальной жизни для закрытия файлов чаще всего используется конструкция with. Её намного удобней использовать, чем закрывать файл явно. Но, так как в жизни можно встретить и метод close, в этом разделе рассматривается как его использовать.
После завершения работы с файлом, его нужно закрыть. В некоторых случаях Python может самостоятельно закрыть файл. Но лучше на это не рассчитывать и закрывать файл явно.
Метод close встречался в разделе запись файлов. Там он был нужен для того, чтобы содержимое файла было записано на диск.
Для этого, в Python есть отдельный метод flush. Но так как в примере с записью файлов, не нужно было больше выполнять никаких операций, файл можно было закрыть.
Откроем файл r1.txt:
In [1]: f = open('r1.txt', 'r') In [2]: print(f.read()) ! service timestamps debug datetime msec localtime show-timezone year service timestamps log datetime msec localtime show-timezone year service password-encryption service sequence-numbers ! no ip domain lookup ! ip ssh version 2 !
У объекта file есть специальный атрибут closed, который позволяет проверить, закрыт файл или нет. Если файл открыт, он возвращает False:
In [3]: f.closed Out[3]: False
Теперь закрываем файл и снова проверяем closed:
In [4]: f.close() In [5]: f.closed Out[5]: True
Если попробовать прочитать файл, возникнет исключение:
In [6]: print(f.read()) ------------------------------------------------------------------ ValueError Traceback (most recent call last)in () ----> 1 print(f.read()) ValueError: I/O operation on closed file
Конструкция with называется менеджер контекста.
В Python существует более удобный способ работы с файлами, чем те, которые использовались до сих пор - конструкция with:
In [1]: with open('r1.txt', 'r') as f: ....: for line in f: ....: print(line) ....: ! service timestamps debug datetime msec localtime show-timezone year service timestamps log datetime msec localtime show-timezone year service password-encryption service sequence-numbers ! no ip domain lookup ! ip ssh version 2 !
Кроме того, конструкция with гарантирует закрытие файла автоматически.
В предыдущем выводе, между строками файла были лишние пустые строки, так как print добавляет ещё один перевод строки.
Чтобы избавиться от этого, можно использовать метод rstrip:
In [2]: with open('r1.txt', 'r') as f: ....: for line in f: ....: print(line.rstrip()) ....: ! service timestamps debug datetime msec localtime show-timezone year service timestamps log datetime msec localtime show-timezone year service password-encryption service sequence-numbers ! no ip domain lookup ! ip ssh version 2 ! In [3]: f.closed Out[3]: True
И конечно же, с конструкцией with можно использовать не только такой построчный вариант считывания, все методы, которые рассматривались до этого, также работают:
In [4]: with open('r1.txt', 'r') as f: ....: print(f.read()) ....: ! service timestamps debug datetime msec localtime show-timezone year service timestamps log datetime msec localtime show-timezone year service password-encryption service sequence-numbers ! no ip domain lookup ! ip ssh version 2 !
Иногда нужно работать одновременно с двумя файлами. Например, надо записать некоторые строки из одного файла, в другой.
В таком случае, в блоке with можно открывать два файла таким образом:
In [5]: with open('r1.txt') as src, open('result.txt', 'w') as dest: ...: for line in src: ...: if line.startswith('service'): ...: dest.write(line) ...: In [6]: cat result.txt service timestamps debug datetime msec localtime show-timezone year service timestamps log datetime msec localtime show-timezone year service password-encryption service sequence-numbers
Это равнозначно таким двум блокам with:
In [7]: with open('r1.txt') as src: ...: with open('result.txt', 'w') as dest: ...: for line in src: ...: if line.startswith('service'): ...: dest.write(line) ...:
В этом примере будет разбираться вывод команды sh ip int br. Из вывода команды нам надо получить соответствия имя интерфейса - IP-адрес. То есть имя интерфейса - это ключ словаря, а IP-адрес - значение. При этом, соответствие надо делать только для тех интерфейсов, у которых назначен IP-адрес.
Пример вывода команды sh ip int br (файл sh_ip_int_br.txt):
R1#show ip interface brief Interface IP-Address OK? Method Status Protocol FastEthernet0/0 15.0.15.1 YES manual up up FastEthernet0/1 10.0.12.1 YES manual up up FastEthernet0/2 10.0.13.1 YES manual up up FastEthernet0/3 unassigned YES unset up down Loopback0 10.1.1.1 YES manual up up Loopback100 100.0.0.1 YES manual up up
Файл working_with_dict_example_1.py:
result = {} with open('sh_ip_int_br.txt') as f: for line in f: line = line.split() if line and line[1][0].isdigit(): interface, address, *other = line result[interface] = address print(result)
Команда sh ip int br отображает вывод столбцами. Значит нужные поля находятся в одной строке. Скрипт обрабатывает вывод построчно и каждую строку разбивает с помощью метода split.
Полученный в итоге список содержит столбцы вывода. Так как из всего вывода нужны только интерфейсы на которых настроен IP-адрес, выполняется проверка первого символа второго столбца: если первый символ число, значит на интерфейсе назначен адрес и эту строку надо обрабатывать.
В строке interface, address, *other = line выполняется распаковка переменных. В переменную interface попадет имя интерфейса, в address попадет IP-адрес, а в other все остальные поля.
Так как для каждой строки есть пара ключ и значение, они присваиваются в словарь: result[interface] = address.
Результатом выполнения скрипта будет такой словарь (тут он разбит на пары ключ-значение для удобства, в реальном выводе скрипта словарь будет отображаться в одну строку):
{'FastEthernet0/0': '15.0.15.1', 'FastEthernet0/1': '10.0.12.1', 'FastEthernet0/2': '10.0.13.1', 'Loopback0': '10.1.1.1', 'Loopback100': '100.0.0.1'}
Очень часто вывод команд выглядит таким образом, что ключ и значение находятся в разных строках. И надо придумать каким образом обрабатывать вывод, чтобы получить нужное соответствие.
Например, из вывода команды sh ip interface надо получить соответствие имя интерфейса - MTU (файл sh_ip_interface.txt):
Ethernet0/0 is up, line protocol is up Internet address is 192.168.100.1/24 Broadcast address is 255.255.255.255 Address determined by non-volatile memory MTU is 1500 bytes Helper address is not set ... Ethernet0/1 is up, line protocol is up Internet address is 192.168.200.1/24 Broadcast address is 255.255.255.255 Address determined by non-volatile memory MTU is 1500 bytes Helper address is not set ... Ethernet0/2 is up, line protocol is up Internet address is 19.1.1.1/24 Broadcast address is 255.255.255.255 Address determined by non-volatile memory MTU is 1500 bytes Helper address is not set ...
Имя интерфейса находится в строке вида Ethernet0/0 is up, line protocol is up, а MTU в строке вида MTU is 1500 bytes.
Например, попробуем запоминать каждый раз интерфейс и выводить его значение, когда встречается MTU, вместе со значением MTU:
In [2]: with open('sh_ip_interface.txt') as f: ...: for line in f: ...: if 'line protocol' in line: ...: interface = line.split()[0] ...: elif 'MTU is' in line: ...: mtu = line.split()[-2] ...: print('{:15}{}'.format(interface, mtu)) ...: Ethernet0/0 1500 Ethernet0/1 1500 Ethernet0/2 1500 Ethernet0/3 1500 Loopback0 1514
Вывод организован таким образом, что всегда сначала идет строка с интерфейсом, а затем через несколько строк - строка с MTU. Если запоминать имя интерфейса каждый раз, когда оно встречается, то на момент когда встретится строка с MTU, последний запомненный интерфейс - это тот к которому относится MTU.
Теперь, если необходимо создать словарь с соответствием интерфейс - MTU, достаточно записать значения на момент, когда был найден MTU.
Файл working_with_dict_example_2.py:
result = {} with open('sh_ip_interface.txt') as f: for line in f: if 'line protocol' in line: interface = line.split()[0] elif 'MTU is' in line: mtu = line.split()[-2] result[interface] = mtu print(result)
Результатом выполнения скрипта будет такой словарь (тут он разбит на пары ключ-значение для удобства, в реальном выводе скрипта словарь будет отображаться в одну строку):
{'Ethernet0/0': '1500', 'Ethernet0/1': '1500', 'Ethernet0/2': '1500', 'Ethernet0/3': '1500', 'Loopback0': '1514'}
Если из вывода команды надо получить несколько параметров, очень удобно использовать словарь с вложенным словарем.
Например, из вывода `sh ip interface` надо получить два параметра: IP-адрес и MTU. Для начала, вывод информации:
Ethernet0/0 is up, line protocol is up Internet address is 192.168.100.1/24 Broadcast address is 255.255.255.255 Address determined by non-volatile memory MTU is 1500 bytes Helper address is not set ... Ethernet0/1 is up, line protocol is up Internet address is 192.168.200.1/24 Broadcast address is 255.255.255.255 Address determined by non-volatile memory MTU is 1500 bytes Helper address is not set ... Ethernet0/2 is up, line protocol is up Internet address is 19.1.1.1/24 Broadcast address is 255.255.255.255 Address determined by non-volatile memory MTU is 1500 bytes Helper address is not set ...
На первом этапе каждое значение запоминается в переменную, а затем, выводятся все три значения. Значения выводятся, когда встретилась строка с MTU, потому что она идет последней:
In [2]: with open('sh_ip_interface.txt') as f: ...: for line in f: ...: if 'line protocol' in line: ...: interface = line.split()[0] ...: elif 'Internet address' in line: ...: ip_address = line.split()[-1] ...: elif 'MTU' in line: ...: mtu = line.split()[-2] ...: print('{:15}{:17}{}'.format(interface, ip_address, mtu)) ...: Ethernet0/0 192.168.100.1/24 1500 Ethernet0/1 192.168.200.1/24 1500 Ethernet0/2 19.1.1.1/24 1500 Ethernet0/3 192.168.230.1/24 1500 Loopback0 4.4.4.4/32 1514
Тут используется такой же прием, как в предыдущем примере, но добавляется еще одна вложенность словаря:
result = {} with open('sh_ip_interface.txt') as f: for line in f: if 'line protocol' in line: interface = line.split()[0] result[interface] = {} elif 'Internet address' in line: ip_address = line.split()[-1] result[interface]['ip'] = ip_address elif 'MTU' in line: mtu = line.split()[-2] result[interface]['mtu'] = mtu print(result)
Каждый раз, когда встречается интерфейс, в словаре `result` создается ключ с именем интерфейса, которому соответствует пустой словарь. Эта заготовка нужна для того, чтобы на момент когда встретится IP-адрес или MTU можно было записать параметр во вложенный словарь соответствующего интерфейса.
Результатом выполнения скрипта будет такой словарь (тут он разбит на пары ключ-значение для удобства, в реальном выводе скрипта словарь будет отображаться в одну строку):
{'Ethernet0/0': {'ip': '192.168.100.1/24', 'mtu': '1500'}, 'Ethernet0/1': {'ip': '192.168.200.1/24', 'mtu': '1500'}, 'Ethernet0/2': {'ip': '19.1.1.1/24', 'mtu': '1500'}, 'Ethernet0/3': {'ip': '192.168.230.1/24', 'mtu': '1500'}, 'Loopback0': {'ip': '4.4.4.4/32', 'mtu': '1514'}}
Иногда, в выводе будут попадаться секции с пустыми значениями. Например, в случае с выводом `sh ip interface`, могут попадаться интерфейсы, которые выглядят так:
Ethernet0/1 is up, line protocol is up Internet protocol processing disabled Ethernet0/2 is administratively down, line protocol is down Internet protocol processing disabled Ethernet0/3 is administratively down, line protocol is down Internet protocol processing disabled
Соответственно тут нет MTU или IP-адреса.
И если выполнить предыдущий скрипт для файла с такими интерфейсами, результат будет таким (вывод для файла sh_ip_interface2.txt):
{'Ethernet0/0': {'ip': '192.168.100.2/24', 'mtu': '1500'}, 'Ethernet0/1': {}, 'Ethernet0/2': {}, 'Ethernet0/3': {}, 'Loopback0': {'ip': '2.2.2.2/32', 'mtu': '1514'}}
Если необходимо добавлять интерфейсы в словарь только, когда на интерфейсе назначен IP-адрес, надо перенести создание ключа с именем интерфейса на момент, когда встречается строка с IP-адресом (файл working_with_dict_example_4.py):
result = {} with open('sh_ip_interface2.txt') as f: for line in f: if 'line protocol' in line: interface = line.split()[0] elif 'Internet address' in line: ip_address = line.split()[-1] result[interface] = {} result[interface]['ip'] = ip_address elif 'MTU' in line: mtu = line.split()[-2] result[interface]['mtu'] = mtu print(result)
В этом случае результатом будет такой словарь:
{'Ethernet0/0': {'ip': '192.168.100.2/24', 'mtu': '1500'}, 'Loopback0': {'ip': '2.2.2.2/32', 'mtu': '1514'}}
Обработать строки из файла ospf.txt и вывести информацию по каждой строке в таком виде на стандартный поток вывода:
Prefix 10.0.24.0/24 AD/Metric 110/41 Next-Hop 10.0.13.3 Last update 3d18h Outbound Interface FastEthernet0/0
ospf.txt
O 10.0.24.0/24 [110/41] via 10.0.13.3, 3d18h, FastEthernet0/0 O 10.0.28.0/24 [110/31] via 10.0.13.3, 3d20h, FastEthernet0/0 O 10.0.37.0/24 [110/11] via 10.0.13.3, 3d20h, FastEthernet0/0 O 10.0.41.0/24 [110/51] via 10.0.13.3, 3d20h, FastEthernet0/0 O 10.0.78.0/24 [110/21] via 10.0.13.3, 3d20h, FastEthernet0/0 O 10.0.79.0/24 [110/20] via 10.0.19.9, 4d02h, FastEthernet0/2
Создать скрипт, который будет обрабатывать конфигурационный файл config_sw1.txt. Имя файла передается как аргумент скрипту.
Скрипт должен возвращать на стандартный поток вывода команды из переданного конфигурационного файла, исключая строки, которые начинаются с !.
Вывод должен быть без пустых строк.
Пример вывода:
$ python task_7_2.py config_sw1.txt Current configuration : 2033 bytes version 15.0 service timestamps debug datetime msec service timestamps log datetime msec no service password-encryption hostname sw1 interface Ethernet0/0 duplex auto interface Ethernet0/1 switchport trunk encapsulation dot1q switchport trunk allowed vlan 100 switchport mode trunk duplex auto spanning-tree portfast edge trunk interface Ethernet0/2 duplex auto interface Ethernet0/3 switchport trunk encapsulation dot1q switchport trunk allowed vlan 100 duplex auto switchport mode trunk spanning-tree portfast edge trunk ...
Вторая версия без использования Continue:
task_7_2_ver2.py
Сделать копию скрипта задания 7.2.
Дополнить скрипт: Скрипт не должен выводить команды, в которых содержатся слова, которые указаны в списке ignore.
При этом скрипт также не должен выводить строки, которые начинаются на !.
Проверить работу скрипта на конфигурационном файле config_sw1.txt. Имя файла передается как аргумент скрипту.
ignore = ["duplex", "alias", "configuration"]
Решение при использовании пересечения множеств:
task_7_2a_ver2.py
Переделать скрипт из задания 7.2a: вместо вывода на стандартный поток вывода, скрипт должен записать полученные строки в файл
Имена файлов нужно передавать как аргументы скрипту:
имя исходного файла конфигурации
имя итогового файла конфигурации
При этом, должны быть отфильтрованы строки, которые содержатся в списке ignore и строки, которые начинаются на „!“.
Скрипт должен обрабатывать записи в файле CAM_table.txt. Каждая строка, где есть MAC-адрес, должна быть обработана таким образом, чтобы на стандартный поток вывода была выведена таблица вида:
100 01bb.c580.7000 Gi0/1 200 0a4b.c380.7c00 Gi0/2 300 a2ab.c5a0.700e Gi0/3 10 0a1b.1c80.7000 Gi0/4 500 02b1.3c80.7b00 Gi0/5 200 1a4b.c580.7000 Gi0/6 300 0a1b.5c80.70f0 Gi0/7 10 01ab.c5d0.70d0 Gi0/8 1000 0a4b.c380.7d00 Gi0/9
CAM_table.txt
sw1#sh mac address-table Mac Address Table ------------------------------------------- Vlan Mac Address Type Ports ---- ----------- -------- ----- 100 01bb.c580.7000 DYNAMIC Gi0/1 200 0a4b.c380.7c00 DYNAMIC Gi0/2 300 a2ab.c5a0.700e DYNAMIC Gi0/3 10 0a1b.1c80.7000 DYNAMIC Gi0/4 500 02b1.3c80.7b00 DYNAMIC Gi0/5 200 1a4b.c580.7000 DYNAMIC Gi0/6 300 0a1b.5c80.70f0 DYNAMIC Gi0/7 10 01ab.c5d0.70d0 DYNAMIC Gi0/8 1000 0a4b.c380.7d00 DYNAMIC Gi0/9
Переделать скрипт: Отсортировать вывод по номеру VLAN В результате должен получиться такой вывод:
10 01ab.c5d0.70d0 Gi0/8 10 0a1b.1c80.7000 Gi0/4 100 01bb.c580.7000 Gi0/1 200 0a4b.c380.7c00 Gi0/2 200 1a4b.c580.7000 Gi0/6 300 0a1b.5c80.70f0 Gi0/7 300 a2ab.c5a0.700e Gi0/3 500 02b1.3c80.7b00 Gi0/5 1000 0a4b.c380.7d00 Gi0/9
Сделать копию скрипта задания 7.3a.
Переделать скрипт:
- Запросить у пользователя ввод номера VLAN.
- Выводить информацию только по указанному VLAN.
Пример работы скрипта:
Enter VLAN number: 10 10 0a1b.1c80.7000 Gi0/4 10 01ab.c5d0.70d0 Gi0/8
Добавить комментарий