接觸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模板。希望這些內容對你有幫助,如果有任何其他問題或需要進一步的幫助,請告訴我。