前言: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í)行
該庫直接可執(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) )
行比較。
如果作為軟件包安裝,它將在相關(guān)的python版本下。parser.py [--help] template [input_file [output_file]]/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}(首選后一種格式),并指示值分配。將關(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é)