0

can someone help me, i am beginner in programming, my problem is in output i would just like only to filter the mac address. how can i do it.

from netmiko import ConnectHandler

cisco = {
        'device_type' : 'cisco_ios',
        'host' : '192.168.X.Y',
        'username' : 'foo',
        'password' : '123',
}

net_connect = ConnectHandler(**cisco)
net_connect.find_prompt()
show_mac = net_connect.send_command("show mac address-table vlan 100")
print(show_mac)

output :

Vlan    Mac Address       Type        Ports
----    -----------       --------    -----
 100    264b.edf4.eba2    DYNAMIC     Gi0/3
 100    2680.f1ee.c0b1    DYNAMIC     Gi0/2
 100    3a60.2954.1ee2    DYNAMIC     Gi1/3
 100    4a60.05bd.27fc    DYNAMIC     Gi1/2
 100    7e02.eee8.0291    DYNAMIC     Gi0/1
 100    b689.d44e.afd1    DYNAMIC     Gi1/0
 100    d207.6258.5966    DYNAMIC     Gi1/1
Total Mac Addresses for this criterion: 7
Paulw11
  • 108,386
  • 14
  • 159
  • 186
mcaxi
  • 1
  • 1
    What do you mean by filter? Do you mean only print the lines with mac addresses that match a pedefined list? – Chris Mar 28 '20 at 01:17
  • can you pls show the output when you do print(type(show_mac)) – DARK_C0D3R Mar 28 '20 at 02:57
  • you can check 'expect_string' and 'changeto' parameters in that send_command for help you can also use help(net_connect.send_command) – DARK_C0D3R Mar 28 '20 at 03:25
  • if you want to save yourself some work, you could use the `napalm-ios` package. napalm provides solutions for the interaction with network-switches. Here is their docs: https://napalm.readthedocs.io/en/latest/ – hmaier Aug 15 '23 at 13:38

2 Answers2

0

You can use a regex here. Regex allows you to match a certain text structure. As an example:

A regex like 'hello\d{1,3}' could match strings like 'hello12' or 'hello432'.

You can match literal chars as well as placeholders like \d for any digit value, including recurrences. {1,3} = between one and three recurrences. In this case, you want alphanumerical values, which can be matched with \w in python.

^ = following char must be at the beginning of the line.

$ = foregoing char must be at the end of the line.

. = Every char is matched

+ = Match previous char/group at least one or more times. This is a greedy operator, so check your regex when playing around.

Since you want only one part of the matched line, you can use a capture group. Capture groups make substrings in your match accessible separately. Just wrap a parenthesis () around the wished part.

Python has a regex module for this, so here's some sample code:

import re

def your_func():
    mac_addresses = []
    for line in show_mac.split('\n'):  # split the above string in lines
        line = line.strip()  # remove leading and trailing spaces
        pattern = re.compile(r'^\d+\s+(\w{1,4}\.\w{1,4}\.\w{1,4})\s+\w+\s+.+$')
        # match a regex to a string from the beginning
        match = re.match(pattern, line)
        # python match object contains our capture group. first group is at index 1, index 0 is the whole match
        if match and match[1]:
            mac_addresses.append(match[1])

    print(mac_addresses)

mcrivaro
  • 31
  • 5
0

You can also you ttp to parse you data. Please see following config to get mac_addresses from your output.

from ttp import ttp
import json

from netmiko import ConnectHandler

cisco = {
        'device_type' : 'cisco_ios',
        'host' : '192.168.X.Y',
        'username' : 'foo',
        'password' : '123',
}

net_connect = ConnectHandler(**cisco)
net_connect.find_prompt()
data_to_parse = net_connect.send_command("show mac address-table vlan 100")

ttp_template = '''
 {{vlan_id}}    {{mac_address}}    {{type}}     {{ports}}
'''

def mac_address_parser(data_to_parse): # "  Svc: 307006600 65035   483570    0 0148d14h  2/2/8 (IPv4)"'da parslıyor ekstradan. 
    
    parser = ttp(data=data_to_parse, template=ttp_template)
    parser.parse()

    # print result in JSON format
    results = parser.result(format='json')[0]
    #print(results)

    #converting str to json. 
    result = json.loads(results)

    return(result)

parsed_mac_address_parser = mac_address_parser(data_to_parse)

for mac_address in parsed_mac_address_parser[0]:
    print(mac_address['mac_address'])

Please kindly see the output after the above code runs:

enter image description here

Baris Ozensel
  • 433
  • 1
  • 3
  • 11