TextFSM教學與Python GUI練習器

接觸TextFSM已經過了一年,自從ChatGPT問世,就想讓我的夥伴學習,或是讓ChatGPT成為那個翻譯的角色,但可惜的是夥伴覺得太難,當時ChatGPT 3.5也沒有辦法達到我想要的效果。

為了讓TextFSM更容易學習,如今我寫作經常導入ChatGPT 4o輔助,設計出一些方便學習的GUI,而不是冷冰冰的Code。

以後文章可能會藉助LLM生成去加速撰寫與安排細節,人就主要用於內容檢核與調整。當然人還是要會,才能把關文章內容,不會直接把未經驗證或未瞭解的東西直接放上。

以下內容為LLM生成並且經過調整

引言

本指南旨在幫助沒有安裝Python環境的Windows使用者,從零開始設置並運行一個用於解析網絡設備輸出數據的工具——TextFSM。我們將介紹TextFSM的概念、用途、以及如何在Python環境中使用它來解析文本數據。

步驟概述

  1. 了解TextFSM及其用途
  2. 安裝Python和相關工具
  3. 創建並測試Python腳本
  4. 使用TextFSM解析文本數據
  5. 生成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

  1. 下載Python安裝程序:Python 官方下載頁面
  2. 運行下載的安裝程序,並選中”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模板由一系列的ValueStart部分組成。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模板。希望這些內容對你有幫助,如果有任何其他問題或需要進一步的幫助,請告訴我。