YÊU CẦU:
1. Trích lọc lấy các cột dữ liệu Address và Hardware Addr trong khối dữ liệu thô lấy được từ kết quả show arp
2. Trích lọc lấy cột VLAN và MAC_ADDRESS trong khối dữ liệu thô từ kết quả show mac address-table, nhưng chỉ lấy các vlan 101 -> 104 và vlan 107 -> 108. Kết quả trích lọc sẽ được lưu vào file theo định dạng CSV
THỰC HIỆN:
1. Trích lọc lấy các cột dữ liệu Address và Hardware Addr trong khối dữ liệu thô lấy được từ kết quả show arp.
Nhận xét:Có rất nhi ều cách xử lý để lấy ra được dữ liệu theo yêu cầu. Tuy nhiên hôm nay chúng tôi giới thiệu các bạn sử dụng TextFSM kết hợp với Regular Expression
a. Định nghĩa/tạo file show_arp.template (file này được lưu thư mục chứa file Demo.py) với các dạng: IP Address và Hardward Addr (MAC)
Value MAC_ADDRESS ([a-fA-F0-9]{4}\.[a-fA-F0-9]{4}\.[a-fA-F0-9]{4})
Value IP_ADDRESS (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})
Start
^Internet\s+${IP_ADDRESS}\s+(\d+|\-)\s+${MAC_ADDRESS}\s+ -> Record
Giải thích:
- Value IP_ADDRESS: tên của biến
-Ý nghĩa dòng RegEx "^Internet\s+${IP_ADDRESS}\s+(\d+|\-)\s+${MAC_ADDRESS}\s+":
b. Code (Demo.py):
import textfsm
from pprint import pprint # dùng để in ra đẹp, dễ nhìn hơn
show_arp = '''Building-1_Factory-1_2960_24#show arp
Protocol Address Age (min) Hardware Addr Type Interface
Internet 192.168.100.7 6 00d7.8f0d.b83f ARPA Vlan1
Internet 192.168.100.11 - 08cc.a7dd.e440 ARPA Vlan1
Internet 192.168.100.32 56 3087.d91e.1c50 ARPA Vlan1
Internet 192.168.100.35 65 f8e7.1e34.31d0 ARPA Vlan1
Internet 192.168.100.51 65 348f.2712.aa80 ARPA Vlan1
Internet 192.168.100.61 65 8423.8805.8370 ARPA Vlan1
Internet 192.168.100.62 65 c803.f53a.ccf0 ARPA Vlan1
Internet 192.168.100.63 65 c803.f50c.4a50 ARPA Vlan1
Internet 192.168.100.65 65 4cb1.cd3c.1af0 ARPA Vlan1
Internet 192.168.100.66 65 4cb1.cd3b.cd30 ARPA Vlan1
Internet 192.168.100.179 10 f28c.d229.b87b ARPA Vlan1
Internet 192.168.116.15 73 00d7.8f0d.b83f ARPA Vlan1
Internet 192.168.116.37 142 00d7.8f0d.b83f ARPA Vlan1
'''
with open('show_arp.template') as template: # Mở file show_arp.template vừa định nghĩa
fsm = textfsm.TextFSM(template)
show_arp = fsm.ParseText(show_arp)
print(fsm.header) # in ra tên các biến được định nghĩa trong file show_arp.template
pprint(show_arp) # Kết quả trích lọc/lấy được thỏa điều kiện Regular Expression
Kết quả:
['MAC_ADDRESS', 'IP_ADDRESS'][['00d7.8f0d.b83f', '192.168.100.7'],['08cc.a7dd.e440', '192.168.100.11'],['3087.d91e.1c50', '192.168.100.32'],['f8e7.1e34.31d0', '192.168.100.35'],['348f.2712.aa80', '192.168.100.51'],['8423.8805.8370', '192.168.100.61'],['c803.f53a.ccf0', '192.168.100.62'],['c803.f50c.4a50', '192.168.100.63'],['4cb1.cd3c.1af0', '192.168.100.65'],['4cb1.cd3b.cd30', '192.168.100.66'],['f28c.d229.b87b', '192.168.100.179'],['00d7.8f0d.b83f', '192.168.116.15'],['00d7.8f0d.b83f', '192.168.116.37']][Finished in 0.1s]
2. Trích lọc lấy cột VLAN và MAC_ADDRESS trong khối dữ liệu thô từ kết quả show mac address-table, nhưng chỉ lấy các vlan 101 -> 104 và vlan 107 -> 108. Kết quả trích lọc sẽ được lưu vào file theo định dạng CSV
Value VLAN ([1][0]([1-4]|[7-8]))
Value MAC_ADDRESS ([0-9a-fA-F]{4}(?:\.[0-9a-fA-F]{4}){2})
Start
^Vlan\s+Mac Address\s+Type\s+Ports -> TYPE1
TYPE1
^\s*${VLAN}\s+${MAC_ADDRESS}\s+ -> Record
import textfsm
import pandas as pd # dùng khi ghi file csv
from pprint import pprint # dùng để in ra đẹp, dễ nhìn hơn
show_mac_address = '''Building-1_Factory-1_2960_24#show mac address-table
Mac Address Table
-------------------------------------------
Vlan Mac Address Type Ports
---- ----------- -------- -----
All 0100.0ccc.cccc STATIC CPU
All 0100.0ccc.cccd STATIC CPU
All 0180.c200.0000 STATIC CPU
All 0180.c200.0001 STATIC CPU
All 0180.c200.0002 STATIC CPU
All 0180.c200.000d STATIC CPU
All 0180.c200.000e STATIC CPU
All 0180.c200.000f STATIC CPU
All 0180.c200.0010 STATIC CPU
All ffff.ffff.ffff STATIC CPU
100 0000.7d30.b3b7 DYNAMIC Gi0/1
100 0000.7d30.b3c2 DYNAMIC Fa0/23
101 0002.6510.92d3 DYNAMIC Fa0/23
101 0002.6510.b148 DYNAMIC Fa0/23
101 0002.6510.befe DYNAMIC Fa0/23
101 0002.6512.8a34 DYNAMIC Fa0/23
102 0002.6513.c157 DYNAMIC Fa0/23
102 0002.6513.fd5f DYNAMIC Fa0/23
102 0002.6513.fd62 DYNAMIC Fa0/23
102 0002.6513.fdbd DYNAMIC Fa0/23
103 0002.6513.fe26 DYNAMIC Fa0/23
103 0002.6514.5de5 DYNAMIC Fa0/23
108 0002.6516.793e DYNAMIC Fa0/23
103 0016.e637.f51f DYNAMIC Gi0/1
104 001d.9291.71cb DYNAMIC Fa0/23
113 accb.51d5.2d3d DYNAMIC Gi0/1
113 accb.51f5.4e4e DYNAMIC Gi0/1
115 b4a3.82c4.374a DYNAMIC Gi0/1
109 c051.7ef3.c089 DYNAMIC Gi0/1
109 c051.7ef3.c214 DYNAMIC Gi0/1
108 001e.8ccd.f971 DYNAMIC Gi0/1
100 0024.1db9.ab37 DYNAMIC Gi0/1
101 006c.bcb2.5e9d DYNAMIC Gi0/1
101 d027.88bd.4b80 DYNAMIC Gi0/1
102 e0d5.5e17.5c5c DYNAMIC Gi0/1
100 eca8.6b77.808a DYNAMIC Gi0/1
101 0000.7d30.b3ba DYNAMIC Gi0/1
104 001b.fc9f.af1c DYNAMIC Gi0/1
101 001f.d018.26e1 DYNAMIC Gi0/1
101 001f.d0c1.71f8 DYNAMIC Gi0/1
102 bc5f.f47d.cad6 DYNAMIC Gi0/1
110 f003.8c8e.b2cd DYNAMIC Gi0/1
110 f003.8c8e.b2d1 DYNAMIC Gi0/1
110 f003.8c8e.b2f3 DYNAMIC Gi0/1
112 00d7.8f0d.b83f DYNAMIC Gi0/1
112 04b4.290a.2ad1 DYNAMIC Gi0/1
105 04d6.aad0.3772 DYNAMIC Gi0/1
112 0c2f.b065.e65c DYNAMIC Fa0/1
112 1881.0e21.f5ff DYNAMIC Gi0/1
1 1887.407b.444d DYNAMIC Gi0/1
112 2047.da27.a341 DYNAMIC Gi0/1
112 20a2.e416.c350 DYNAMIC Gi0/1
113 e0c3.7709.5c28 DYNAMIC Gi0/1
113 e493.6a45.0717 DYNAMIC Gi0/1
113 ec51.bc56.cced DYNAMIC Gi0/1
1 f0db.e2ba.c6c6 DYNAMIC Gi0/1
113 f8da.0c82.844f DYNAMIC Gi0/1
107 f8e6.1a10.79f6 DYNAMIC Gi0/1
107 286f.7ff2.34e0 DYNAMIC Gi0/1
106 0017.c498.c864 DYNAMIC Gi0/1
106 0095.697f.49e8 DYNAMIC Gi0/1
116 00d7.8f0d.b83f DYNAMIC Gi0/1
1 04d6.aa5b.9e4c DYNAMIC Gi0/1
1 04d6.aade.dd3b DYNAMIC Gi0/1
1 08e6.89ab.13a5 DYNAMIC Gi0/1
'''
with open('show_mac_address.template') as template: # Mở file show_mac_address.template vừa định nghĩa
fsm = textfsm.TextFSM(template)
show_mac_address = fsm.ParseText(show_mac_address)
#print(fsm.header)
#pprint(show_mac_address)
df = pd.DataFrame(show_mac_address) # convert dữ liệu sang kiểu DataFrame
df.to_csv("show_mac_address.csv", header = fsm.header, index = False) # Ghi dữ liệu vừa trích lọc vào file với header tương ứng và không cần điền thêm cột index
Kết quả file show_mac_address.csv có dạngXong!
No comments:
Post a Comment