textfsm初探之使用TextFSM解析CLI輸出(Python)

前言:TextFSM是基于模板的狀態(tài)機,用于將半格式的文本解析為表。它由Google開發(fā),并托管在Google Code上。您還可以在GitHub上找到各種fork,例如對python 3的支持(我們將在以后使用)。它是高度可定制的,因為它與單獨的模板定義一起使用,其中包含帶有正則表達式的變量和規(guī)則。該庫對于解析網(wǎng)絡設備的任何基于文本的CLI輸出非常有幫助。TextFSM可以在python腳本中使用,也可以作為獨立工具使用。


目錄

什么是TextFSM

TextFSM是一個Python模塊,該模塊實現(xiàn)了用于分析半格式文本的基于模板的狀態(tài)機。最初是為了允許以編程方式訪問由CLI驅(qū)動的設備(例如網(wǎng)絡路由器和交換機)的輸出所給出的信息而開發(fā)的,但是它可用于任何此類文本輸出。
引擎接受兩個輸入-模板文件和文本輸入(例如來自設備的CLI的命令響應),并返回包含從文本中解析出的數(shù)據(jù)的記錄列表。
每個唯一結(jié)構(gòu)化的文本輸入都需要一個模板文件。該代碼提供了一些示例,并鼓勵用戶自己開發(fā)。
通過開發(fā)模板文件池,腳本可以調(diào)用textFSM來解析來自各種來源的有用信息。也可以在同一數(shù)據(jù)上使用不同的模板,以創(chuàng)建不同的表(或視圖)

細節(jié)

快速入門示例

  • 安裝
    pip install textfsm==1.1.0
    
  • 執(zhí)行
    # Run text through the FSM. 
    # The argument 'template' is a file handle and 'raw_text_data' is 
    a 
    string.
    re_table = textfsm.TextFSM(template)
    data = re_table.ParseText(raw_text_data)
    # Display result as CSV
    # First the column headers
    print( ', '.join(re_table.header) )
    # Each row of the table.
    for row in data:
      print( ', '.join(row) )
    
    該庫直接可執(zhí)行,可用于檢查模板的語法并將輸入與預期輸出進
    行比較。
    parser.py [--help] template [input_file [output_file]]
    
    如果作為軟件包安裝,它將在相關(guān)的python版本下。
    /usr/local/lib/pythonx.y/dist-packages/textfsm/parser.py
    

數(shù)據(jù)表示

FSM的核心是從文本數(shù)據(jù)中提取基本數(shù)據(jù),并將其放入表格形式。
鑒于以下原始輸入,我們可能對線卡狀態(tài)和溫度感興趣:

Routing Engine status:
  Slot 0:
    Current state                  Master
    Election priority              Master (default)
    Temperature                 39 degrees C / 102 degrees F
    CPU temperature             55 degrees C / 131 degrees F
    DRAM                      2048 MB
    Memory utilization          76 percent
    CPU utilization:
      User                      95 percent
      Background                 0 percent
      Kernel                     4 percent
      Interrupt                  1 percent
      Idle                       0 percent
    Model                          RE-4.0
    Serial ID                      xxxxxxxxxxxx
    Start time                     2008-04-10 20:32:25 PDT
    Uptime                         180 days, 22 hours, 45 minutes, 20 seconds
    Load averages:                 1 minute   5 minute  15 minute
                                       0.96       1.03       1.03
Routing Engine status:
  Slot 1:
    Current state                  Backup
    Election priority              Backup
    Temperature                 30 degrees C / 86 degrees F
    CPU temperature             31 degrees C / 87 degrees F
    DRAM                      2048 MB
    Memory utilization          14 percent
    CPU utilization:
      User                       0 percent
      Background                 0 percent
      Kernel                     0 percent
      Interrupt                  1 percent
      Idle                      99 percent
    Model                          RE-4.0
    Serial ID                      xxxxxxxxxxxx
    Start time                     2008-01-22 07:32:10 PST
    Uptime                         260 days, 10 hours, 45 minutes, 39 seconds

通過適當?shù)哪0鍖⒋宋谋据斎霊糜贔SM,結(jié)果以表格表示形式返回,其中線卡和相關(guān)數(shù)據(jù)作為記錄字段關(guān)聯(lián)在一起。

插槽 模型 德拉姆 溫度 CPU溫度
0 RE-4.0 2048 39 55
1 RE-4.0 2048 后備 30 31

模板文件

模板文件描述了FSM應該如何解析數(shù)據(jù)。不同的文本輸入模式需要單獨的模板。例如,解析路由器命令的輸出通常需要為每個命令使用一個模板。
完整的示例模板如下。在這種情況下,要處理路由器的上述“ show機箱路由引擎”命令輸出:

# Chassis value will be null for single chassis routers.
Value Filldown Chassis (.cc.?-re.)
Value Required Slot (\d+)
Value State (\w+)
Value Temp (\d+)
Value CPUTemp (\d+)
Value DRAM (\d+)
Value Model (\S+)

# Allway starts in 'Start' state.
Start
  ^${Chassis}
  # Record current values and change state.
  # No record will be output on first pass as 'Slot' is 'Required' but empty.
  ^Routing Engine status: -> Record RESlot

# A state transition was not strictly necessary but helpful for the example.
RESlot
  ^\s+Slot\s+${Slot}
  ^\s+Current state\s+${State}
  ^\s+Temperature\s+${Temp} degrees
  ^\s+CPU temperature\s+${CPUTemp} degrees
  ^\s+DRAM\s+${DRAM} MB
  # Transition back to Start state.
  ^\s+Model\s+${Model} -> Start

# An implicit EOF state outputs the last record.

模板文件由兩個頂級部分組成。

  • “值”定義,描述要提取的數(shù)據(jù)列。
  • 一個或多個“狀態(tài)”定義,描述了在解析數(shù)據(jù)時引擎的各種狀態(tài)。
    如果一行以任何可選的空格開頭,則該哈希即為正則表達式:匹
    配"^\s*#"。

值定義

一或多個“值”行用于描述結(jié)果表中的每一列。這些值行必須全部出現(xiàn)在任何狀態(tài)定義之前,并且必須是連續(xù)的行,僅由注釋分隔。
每個“價值”行的格式如下:
值 [option [,option ...]]名稱正則表達式

關(guān)鍵詞 類型 描述
關(guān)鍵詞 表示這是必填項的值行條目。
選項 標記,逗號分隔(無空格) 關(guān)于價值的額外選擇??赡苁?以下一項或多項: 填充先前匹配的值將保留用于后續(xù)記錄(除非明確清除或再次匹配)。換句話說,除非再次匹配,否則將最近匹配的值復制到較新的行。關(guān)鍵字聲明字段內(nèi)容構(gòu)成行的唯一標識符。 必需僅當此值匹配時,記錄(行)才保存到表中。 列表值是一個列表,附加在每個匹配項上。通常,匹配項將覆蓋該 行中的所有先前值。Fillup像Filldown,但向上填充,直到找到一個非空條目。與“必 需”不兼容。
名稱 值名稱 值的名稱,該名稱最終將作為列名稱。不得為有效選項的名稱。
正則表達式 正則表達式 值將與之匹配的正則表達式。此正則表達式必須包含在括號內(nèi)。

狀態(tài)定義

在值定義之后,將描述狀態(tài)定義。每個狀態(tài)定義由空白行分隔。第一行是州名,一個字母數(shù)字單詞,后接一系列規(guī)則。
狀態(tài)定義具有以下格式:

stateName
 ^rule
 ^rule
 ...

多個狀態(tài)定義應至少由一個空白行分隔。規(guī)則在州名后的連續(xù)行中描述,并且必須縮進一兩個空格和一個克拉('^')。
最初,F(xiàn)SM將在“ 開始”狀態(tài)下開始。僅將輸入與當前狀態(tài)進行比較,但是匹配的行可以觸發(fā)到新狀態(tài)的轉(zhuǎn)換。評估逐行進行,直到遇到EOF或當前狀態(tài)轉(zhuǎn)換為End狀態(tài)為止。

保留狀態(tài)

FSM以Start狀態(tài)啟動,因此此標簽是必需的,沒有它,模板將無法解析。
如果EOF被輸入達成,則EOF狀態(tài)時執(zhí)行。這是一個隱式狀態(tài),看起來像:

EOF
  ^.* -> Record

EOF在返回之前記錄當前行。要覆蓋此行為-顯式定義一個空的EOF狀態(tài)。像這樣的結(jié)束狀態(tài)被保留,并且終止處理的輸入線,并且不執(zhí)行所述EOF狀態(tài)。

EOF

州規(guī)則

每個狀態(tài)定義都包含一個或多個規(guī)則的列表。FSM從輸入緩沖區(qū)讀取一行,并從當前狀態(tài)的頂部開始依次針對每條規(guī)則對其進行測試。如果規(guī)則與該行匹配,那么將執(zhí)行該操作,并且該過程(從狀態(tài)頂部再次開始)與下一行重復。

規(guī)則具有以下格式:

^ 正則表達式 [ -> 操作 ]

regex是與輸入行相比的正則表達式。匹配是從輸入行的開頭執(zhí)行的,因此,克拉號('^')盡管隱含,但仍是必需的語法,以提醒您此行為。

正則表達式可以包含零個或多個值描述符。值描述符的格式為ValueName或 {ValueName}(首選后一種格式),并指示值分配。將關(guān)聯(lián)值的正則表達式替換為規(guī)則regex,如果該行匹配,則將與此值匹配的文本分配給當前行。為了表示行尾(EOL),請使用雙美元符號“ $$”,它將在“值”替換期間替換為單個美元符號。

例如,使用以下模板:

Value Interface (\S+)

Start
  ^Interface ${Interface} is up

最初分析模板時,F(xiàn)SM會將規(guī)則的正則表達式擴展為:

^Interface (\S+) is up

如果通過此規(guī)則分析了以下行,那么將為值“接口”賦予值GigabitEthernet1 / 10

Interface GigabitEthernet1/10 is up.

可以將多個值替換放入規(guī)則正則表達式中。整個擴展的正則表達式必須匹配,才能分配任何值。

規(guī)則動作

在正則表達式之后,可以描述動作,以“->”分隔,其格式為“ AB C”。
動作分為三個可選部分。A)線動作,在輸入線上的動作。B)記錄操作,對到目前為止收集的值執(zhí)行操作。C)國家過渡。
如果未描述動作,即沒有'->',則默認的隱式動作為Next.NoRecord。

  • 線動作
行動 描述
下一個 從輸入行結(jié)束,讀下一行,然后從狀態(tài)開始再次開始匹 配。如果未指定任何行操 作,則這是默認行為。
繼續(xù) 從輸入行結(jié)束,讀下一行,然后從狀態(tài)開始再次開始匹 配。如果未指定任何行操作 , 則這是默認行為。

什么是CliTable


見下一章節(jié)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容