/*auto readmore*/ /*auto readmore*/ /* an hien script*/ // an hien password /*an hien ma chuong trinh cong tru */ /*Scrollbox thanh cuon*/ /***Nhung CODE***/ /* dòng xanh dòng trắng */ /* https://cdnjs.com/libraries/prism lay thu vien, can vao ten file ma goi 1. copy link vao vi du:prism-python.min.js 2. ten ngon nua la python */ /*=== New posts ===*/ /*header slider*/ /*=== bai viet lien quan===*/ /*===tabcode===*/

Học Python Qua Ví Dụ #025 - TextFSM, Pandas DataFrame & Ghi CSV File

 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:
* Hàng 1:
- MAC_ADDRESS: tên của biến
- ([a-fA-F0-9]{4}\.[a-fA-F0-9]{4}\.[a-fA-F0-9]{4}): Giá trị của địa chỉ MAC có dạng (Regular Expression sẽ thực hiện lọc ra nếu thỏa điều kiện)

Hàng 2:
- Value IP_ADDRESS: tên của biến
- (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}): Giá trị của địa chỉ IPv4 có dạng

Hàng 3:
Là dòng trắng(bắt buộc phải có dòng trắng này)

Hàng 4:
Start

Hàng 5:
2 khoảng trắng, dấu "^" chuỗi được bắt đầu bởi <nội dung định nghĩa của regular expression> -> Record: Báo hiệu kết thúc và thực hiện

-Ý nghĩa dòng RegEx "^Internet\s+${IP_ADDRESS}\s+(\d+|\-)\s+${MAC_ADDRESS}\s+":
Bắt đầu là chuỗi Internet, là khoảng trắng có thể xuất hiện 1 hoặc nhiều lầnđịnh dạng của địa chỉ IP_ADDRESS được định nghĩa (vlaue IP_ADDRESS), là khoảng trắng có thể xuất hiện 1 hoặc nhiều lần, có thể là số xuất hiện 1 hoặc nhiều lần HOẶC là ký tự "_", là khoảng trắng có thể xuất hiện 1 hoặc nhiều lần, định dạng của địa chỉ MAC_ADDRESS, là khoảng trắng xuất hiện 1 hoặc nhiều lần

Các bạn có thể tìm hiểu thêm về Regular Expression tại đây


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

a. Tạo file teamplate show_mac_address.template:

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

Giải thích:
Kết quả trả về có thể có nhiều dạng khác nhau, tùy mỗi dạng mà chúng ta xử lý/lấy/trích lọc phù hợp với yêu cầu. Ở đây chúng ta xét nếu chúng trả về dạng: ^Vlan\s+Mac Address\s+Type\s+Ports thì nhảy đến TYPE1 để thực hiện trích lọc. (chú ý phải có dòng trắng số 3, và dòng trắng số 6)

b. Code:

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ạng

Xong!


No comments:

Post a Comment

/*header slide*/