接觸TextFSM已經過了一年,自從ChatGPT問世,就想讓我的夥伴學習,或是讓ChatGPT成為那個翻譯的角色,但可惜的是夥伴覺得太難,當時ChatGPT 3.5也沒有辦法達到我想要的效果。
為了讓TextFSM更容易學習,如今我寫作經常導入ChatGPT 4o輔助,設計出一些方便學習的GUI,而不是冷冰冰的Code。
以後文章可能會藉助LLM生成去加速撰寫與安排細節,人就主要用於內容檢核與調整。當然人還是要會,才能把關文章內容,不會直接把未經驗證或未瞭解的東西直接放上。
以下內容為LLM生成並且經過調整
引言
本指南旨在幫助沒有安裝Python環境的Windows使用者,從零開始設置並運行一個用於解析網絡設備輸出數據的工具——TextFSM。我們將介紹TextFSM的概念、用途、以及如何在Python環境中使用它來解析文本數據。
步驟概述
- 了解TextFSM及其用途
- 安裝Python和相關工具
- 創建並測試Python腳本
- 使用TextFSM解析文本數據
- 生成TextFSM模板
1. 了解TextFSM及其用途
TextFSM概述
TextFSM是一個用於解析基於文本的數據的Python庫。它通過模板定義,將結構化數據從非結構化的文本中提取出來。這在網絡管理中非常有用,因為很多網絡設備的輸出是非結構化的文本格式。TextFSM可以用來將這些文本數據轉換成結構化數據,以便於後續處理和分析。
TextFSM用途
- 網絡設備日誌解析:提取設備日誌中的關鍵數據,用於監控和分析。
- 配置文件解析:從配置文件中提取配置信息,用於自動化配置管理。
- 命令輸出解析:解析網絡設備命令的輸出,例如
show命令,提取有用信息。
TextFSM範例
假設我們有以下網絡設備輸出數據:
AP Database Summary ------------------- AP Mode Total Up Total Down Total Upgrading* Total Rebooting* RAP Up RAP Down RAP Upgrading* RAP Rebooting* Active Up Standby Up ------- -------- ---------- ---------------- ---------------- ------ -------- -------------- -------------- --------- ---------- Access Points 1899 92 0 0 1899 92 0 0 942 957 Air Monitors 0 0 0 0 0 0 0 0 0 0 Wired Access Points 0 0 0 0 0 0 0 0 0 0 Mesh Portals 0 0 0 0 0 0 0 0 0 0 Mesh Points 0 0 0 0 0 0 0 0 0 0 Spectrum Monitors 0 0 0 0 0 0 0 0 0 0 *Upgrading, Rebooting, Active and Standby counts only reflect APs registered on this controller. Unprovisioned Access Points:0 Duplicated AP Name:1
我們希望從中提取每種AP模式的各項數據,可以使用以下TextFSM模板:
Value APMODE ([\\\\w ]+\\\\w)
Value TOTALUP (\\\\d+)
Value TOTALDOWN (\\\\d+)
Value TOTALUPGRAGING (\\\\d+)
Value TOTALREBOOTING (\\\\d+)
Value RAPUP (\\\\d+)
Value RAPDOWN (\\\\d+)
Value RAPUPGRAGING (\\\\d+)
Value RAPREBOOTING (\\\\d+)
Value ACTIVEUP (\\\\d+)
Value STANDBYUP (\\\\d+)
Start
^${APMODE}\\\\s+${TOTALUP}\\\\s+${TOTALDOWN}\\\\s+${TOTALUPGRAGING}\\\\s+${TOTALREBOOTING}\\\\s+${RAPUP}\\\\s+${RAPDOWN}\\\\s+${RAPUPGRAGING}\\\\s+${RAPREBOOTING}\\\\s+${ACTIVEUP}\\\\s+${STANDBYUP} -> Record
2. 安裝Python和相關工具
首先,需要在你的計算機上安裝Python和相關工具。
安裝Python
- 下載Python安裝程序:Python 官方下載頁面
- 運行下載的安裝程序,並選中”Add Python to PATH”選項,然後點擊”Install Now”
安裝TextFSM
打開命令提示符,輸入以下命令以安裝TextFSM:
pip install textfsm
3. 創建並測試Python腳本
創建一個新的Python腳本,命名為textfsm_gui.py,並添加以下代碼:
import tkinter as tk
from tkinter import filedialog, scrolledtext, messagebox
import textfsm
import pandas as pd
import tempfile
import os
# 獲取.py文件所在的目錄
default_dir = os.path.dirname(os.path.abspath(__file__))
# 創建主窗口
root = tk.Tk()
root.title("TextFSM GUI")
# 設置窗口大小
root.geometry('1000x800')
# 三個區塊:文字資料、TextFSM模板、TextFSM解析結果
frame1 = tk.LabelFrame(root, text="文字資料")
frame1.grid(row=0, column=0, padx=10, pady=5, sticky="nsew")
frame2 = tk.LabelFrame(root, text="TextFSM模板")
frame2.grid(row=1, column=0, padx=10, pady=5, sticky="nsew")
frame3 = tk.LabelFrame(root, text="TextFSM解析結果")
frame3.grid(row=2, column=0, padx=10, pady=5, sticky="nsew")
# 讓窗口的行和列能夠自動調整大小
root.grid_rowconfigure(0, weight=1)
root.grid_rowconfigure(1, weight=1)
root.grid_rowconfigure(2, weight=1)
root.grid_columnconfigure(0, weight=1)
# 文字資料區塊
input_text = scrolledtext.ScrolledText(frame1, wrap=tk.WORD, height=10)
input_text.pack(fill="both", expand=True, padx=5, pady=5)
# TextFSM模板區塊
fsm_text = scrolledtext.ScrolledText(frame2, wrap=tk.WORD, height=10)
fsm_text.pack(fill="both", expand=True, padx=5, pady=5)
# TextFSM解析結果區塊
result_text = scrolledtext.ScrolledText(frame3, wrap=tk.WORD, height=10)
result_text.pack(fill="both", expand=True, padx=5, pady=5)
# 全局變量保存解析結果
global_df = pd.DataFrame()
# 讀取文件的回調函數
def load_file():
file_path = filedialog.askopenfilename(initialdir=default_dir, filetypes=[("Text and Log files", "*.txt *.log"), ("All files", "*.*")])
if file_path:
try:
with open(file_path, 'r', encoding='utf-8') as file:
file_content = file.read()
input_text.delete("1.0", tk.END)
input_text.insert(tk.END, file_content)
except Exception as e:
messagebox.showerror("錯誤", f"無法讀取文件:{e}")
# 讀取TextFSM模板的回調函數
def load_fsm_template():
file_path = filedialog.askopenfilename(initialdir=default_dir, filetypes=[("TextFSM Template files", "*.txt"), ("All files", "*.*")])
if file_path:
try:
with open(file_path, 'r', encoding='utf-8') as file:
file_content = file.read()
fsm_text.delete("1.0", tk.END)
fsm_text.insert(tk.END, file_content)
except Exception as e:
messagebox.showerror("錯誤", f"無法讀取文件:{e}")
# 保存TextFSM模板的回調函數
def save_fsm_template():
file_path = filedialog.asksaveasfilename(initialdir=default_dir, defaultextension=".txt", filetypes=[("TextFSM Template files", "*.txt"), ("All files", "*.*")])
if file_path:
try:
with open(file_path, 'w', encoding='utf-8') as file:
file_content = fsm_text.get("1.0", tk.END)
file.write(file_content)
messagebox.showinfo("信息", f"模板已成功保存至: {file_path}")
except Exception as e:
messagebox.showerror("錯誤", f"無法保存文件:{e}")
# TextFSM解析按鈕的回調函數
def parse_text():
global global_df
input_data = input_text.get("1.0", tk.END)
fsm_data = fsm_text.get("1.0", tk.END)
# 檢查是否有空輸入
if not input_data.strip() or not fsm_data.strip():
messagebox.showwarning("警告", "請填寫文字資料和TextFSM模板")
return
# 嘗試解析
try:
with tempfile.NamedTemporaryFile(delete=False, mode='w+',
encoding='utf-8') as temp_fsm_file:
temp_fsm_file.write(fsm_data)
temp_fsm_file.seek(0)
fsm = textfsm.TextFSM(temp_fsm_file)
fsm_results = fsm.ParseText(input_data)
df = pd.DataFrame(fsm_results, columns=fsm.header)
result_text.delete("1.0", tk.END)
result_text.insert(tk.END, df.to_string(index=False))
global_df = df # 保存結果到全局變量
except Exception as e:
messagebox.showerror("錯誤", f"解析失敗:{e}")
# 導出按鈕的回調函數
def export_csv():
if global_df.empty:
messagebox.showwarning("警告", "無可導出的結果")
return
file_path = filedialog.asksaveasfilename(initialdir=default_dir, defaultextension=".csv", filetypes=[("CSV files", "*.csv"), ("All files", "*.*")])
if file_path:
global_df.to_csv(file_path, index=False)
messagebox.showinfo("信息", f"結果已成功導出至: {file_path}")
# 添加讀取文字資料按鈕
load_button = tk.Button(root, text="讀取文字資料", command=load_file)
load_button.grid(row=3, column=0, pady=5, sticky="ew")
# 添加讀取TextFSM模板按鈕
load_fsm_button = tk.Button(root, text="讀取TextFSM模板", command=load_fsm_template)
load_fsm_button.grid(row=4, column=0, pady=5, sticky="ew")
# 添加保存TextFSM模板按鈕
save_fsm_button = tk.Button(root, text="保存TextFSM模板", command=save_fsm_template)
save_fsm_button.grid(row=5, column=0, pady=5, sticky="ew")
# 添加TextFSM解析按鈕
parse_button = tk.Button(root, text="TextFSM解析", command=parse_text)
parse_button.grid(row=6, column=0, pady=5, sticky="ew")
# 添加導出按鈕
export_button = tk.Button(root, text="導出CSV", command=export_csv)
export_button.grid(row=7, column=0, pady=5, sticky="ew")
# 預先填充範例數據
input_text.insert(tk.END, """AP Database Summary
-------------------
AP Mode Total Up Total Down Total Upgrading* Total Rebooting* RAP Up RAP Down RAP Upgrading* RAP Rebooting* Active Up Standby Up
------- -------- ---------- ---------------- ---------------- ------ -------- -------------- -------------- --------- ----------
Access Points 1899 92 0 0 1899 92 0 0 942 957
Air Monitors 0 0 0 0 0 0 0 0 0 0
Wired Access Points 0 0 0 0 0 0 0 0 0 0
Mesh Portals 0 0 0 0 0 0 0 0 0 0
Mesh Points 0 0 0 0 0 0 0 0 0 0
Spectrum Monitors 0 0 0 0 0 0 0 0 0 0
*Upgrading, Rebooting, Active and Standby counts only reflect APs registered on this controller.
Unprovisioned Access Points:0
Duplicated AP Name:1""")
fsm_text.insert(tk.END, """Value APMODE ([\\\\w ]+\\\\w)
Value TOTALUP (\\\\d+)
Value TOTALDOWN (\\\\d+)
Value TOTALUPGRAGING (\\\\d+)
Value TOTALREBOOTING (\\\\d+)
Value RAPUP (\\\\d+)
Value RAPDOWN (\\\\d+)
Value RAPUPGRAGING (\\\\d+)
Value RAPREBOOTING (\\\\d+)
Value ACTIVEUP (\\\\d+)
Value STANDBYUP (\\\\d+)
Start
^${APMODE}\\\\s+${TOTALUP}\\\\s+${TOTALDOWN}\\\\s+${TOTALUPGRAGING}\\\\s+${TOTALREBOOTING}\\\\s+${RAPUP}\\\\s+${RAPDOWN}\\\\s+${RAPUPGRAGING}\\\\s+${RAPREBOOTING}\\\\s+${ACTIVEUP}\\\\s+${STANDBYUP} -> Record""")
# 運行主循環
root.mainloop()
4. 使用TextFSM解析文本數據
運行上述Python腳本,會打開一個圖形界面。你可以在“文字資料”區塊中輸入或加載需要解析的文本數據,在“TextFSM模板”區塊中輸入或加載TextFSM模板,然後點擊“TextFSM解析”按鈕來解析數據。解析結果將顯示在“TextFSM解析結果”區塊中,並且可以導出為CSV文件。
生成TextFSM模板
TextFSM模板結構
TextFSM模板由一系列的Value和Start部分組成。Value部分用於定義要提取的字段及其正則表達式,Start部分定義了模板的開始狀態。
示例模板
以下是一個用於解析網絡設備輸出數據的TextFSM模板示例:
Value APMODE ([\\\\w ]+\\\\w)
Value TOTALUP (\\\\d+)
Value TOTALDOWN (\\\\d+)
Value TOTALUPGRAGING (\\\\d+)
Value TOTALREBOOTING (\\\\d+)
Value RAPUP (\\\\d+)
Value RAPDOWN (\\\\d+)
Value RAPUPGRAGING (\\\\d+)
Value RAPREBOOTING (\\\\d+)
Value ACTIVEUP (\\\\d+)
Value STANDBYUP (\\\\d+)
Start
^${APMODE}\\\\s+${TOTALUP}\\\\s+${TOTALDOWN}\\\\s+${TOTALUPGRAGING}\\\\s+${TOTALREBOOTING}\\\\s+${RAPUP}\\\\s+${RAPDOWN}\\\\s+${RAPUPGRAGING}\\\\s+${RAPREBOOTING}\\\\s+${ACTIVEUP}\\\\s+${STANDBYUP} -> Record
這個模板將提取每種AP模式的各項數據:APMODE, TOTALUP, TOTALDOWN, TOTALUPGRAGING, TOTALREBOOTING, RAPUP, RAPDOWN, RAPUPGRAGING, RAPREBOOTING, ACTIVEUP, STANDBYUP。
總結
通過上述步驟,你已經了解了TextFSM的概念及其用途,並學會了如何在Python環境中使用TextFSM來解析文本數據。你還學會了如何創建並測試Python腳本,以及如何生成TextFSM模板。希望這些內容對你有幫助,如果有任何其他問題或需要進一步的幫助,請告訴我。