概要#
https://github.com/google/textfsm/wiki/TextFSM
クイックスタートの例:#
# 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) )
ライブラリは直接実行可能であり、テンプレートの構文をチェックし、入力を期待される出力と比較するために使用できます。
データ表現#
FSMの基本的な目的は、テキストデータから重要なデータを抽出し、それを表形式の表現に配置することです。
以下、show コマンドの出力結果から必要な情報を取り出す
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
このテキスト入力を適切なテンプレートを使用してFSMに適用すると、結果が表形式で返され、ラインカードと関連データがレコードのフィールドとして関連付けられます。
Slot | Model | Dram | State | Temp | CPUTemp |
---|---|---|---|---|---|
0 | RE-4.0 | 2048 | Master | 39 | 55 |
1 | RE-4.0 | 2048 | Backup | 30 | 31 |
テンプレートファイル#
テンプレートファイルは、FSMがデータを解析する方法の説明です。テキスト入力のさまざまなパターンには、個別のテンプレートが必要です。たとえば、ルーターコマンドからの出力を解析するには、通常、コマンドごとに1つのテンプレートが必要です。
完全なサンプルテンプレートを次に示します。この場合、ルータから出力された上記の「showchassisrouting-engine」コマンドを処理するには次のようにします。
# 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.
テンプレートファイルは、2つのトップレベルセクションで構成されています。
- 抽出するデータの列を説明する「Value」の定義。
- データの解析中のエンジンのさまざまな状態を説明する1つ以上の「State」の定義。
"^\s*#"
行がオプションの空白で始まり、ハッシュが正規表現に一致する場合、その行はコメントと見なされます
「Value」の定義#
結果のテーブルに含まれる各列を説明するために、1つ以上の「値」行が使用されます。これらの値の行はすべて、状態定義の前に表示する必要があり、コメントでのみ区切る連続した行である必要があります。
各「Value」の行の形式は次のとおりです。
- Syntax
Value [option[,option...]] name regex
Keyword | Type | Description |
---|---|---|
Value | Keyword | これが値行エントリであり、必須であることを示します |
Option | Flags, カンマ区切り(スペースなし) | Filldown 以前に一致した値は、後続のレコードのために保持されます(明示的にクリアまたは再度一致しない限り)。 つまり、最後に一致した値は、再度一致しない限り、新しい行にコピーされます。 Key フィールドの内容が行の一意の識別子に寄与することを宣言します。 Required レコード(行)は、この値が一致した場合にのみテーブルに保存されます。 List 値はリストであり、一致するたびに追加されます。 通常、一致すると、その行の以前の値が上書きされます。 Fillup フィルダウンと同様ですが、空でないエントリが見つかるまで上向きに入力されます。 「Required」とは互換性がありません。 |
Name | Value name | 値の名前。最終的には列名になります。有効なオプションの名前であってはなりません。 |
regex | A regex | 値が一致する正規表現。この正規表現は括弧内に含める必要があります。 |
「State」の定義#
各「State」定義は空白行で区切られます。最初の行は「State」名で、英数字の単語の後に一連のルールが続きます。
「State」定義
複数の状態定義は、少なくとも1つの空白行で区切る必要があります。ルールは、状態名の直後の連続する行に記述され、1つまたは2つの空白とカラット( '^')でインデントする必要があります。
最初に、FSMは開始状態で開始します。入力は現在の状態とのみ比較されますが、一致した行が新しい状態への遷移をトリガーする可能性があります。EOFが検出されるか、現在の状態が終了状態に遷移するまで、評価は1行ずつ続行されます。
予約済みの状態#
FSMは状態Startで開始するため、このラベルは必須であり、ラベルがないとテンプレートは解析されません。 入力でEOFに達した場合、EOF状態が実行されます。これは、次のような暗黙の状態です。
EOFは、戻る前に現在の行を記録します。この動作をオーバーライドするには、空のEOF状態を明示的に定義します。そのようです: 終了状態が予約されており、終端は、入力ラインの処理と実行しないEOFの状態。「State」の規則#
各状態定義は、1つ以上のルールのリストで構成されます。FSMは、入力バッファーから行を読み取り、現在の状態の先頭から順に、各ルールに対してそれをテストします。ルールが行に一致する場合、アクションが実行され、プロセスが次の行で(状態の先頭から)繰り返されます。
ルールの形式は次のとおりです。
- Syntax
^正規表現[ -> アクション]
regexは、入力行と比較した正規表現です。一致は入力行の先頭から実行されるため、カラット( '^')は暗黙的ですが、この動作を思い出させるために必要な構文です。
正規表現には、0個以上の値記述子が含まれる場合があります。値記述子は$ ValueNameまたは$ {ValueName}の形式(後者の形式が推奨されます)であり、値の割り当てを示します。関連する値の正規表現がルールの正規表現に置き換えられ、行が一致する場合、この値に一致するテキストが現在の行に割り当てられます。行末(EOL)を示すために、二重ドル記号 '$$'を使用します。これは、値の置換時に単一のドル記号に置き換えられます。
たとえば、次のテンプレートを使用します。
最初にテンプレートを解析するとき、FSMはルールの正規表現を次のように展開します。
次の行がこのルールで解析される場合、値 'Interface'には値GigabitEthernet1 / 10が与えられます:
複数の値の置換をルール正規表現に配置できます。値を割り当てるには、展開された正規表現全体が一致する必要があります。
ルールアクション#
正規表現に続いて、アクションは「->」で区切られ、「ABC」の形式で記述される場合があります。
アクションは、3つのオプション部分に分けられます。A)ラインアクション、入力ラインでのアクション。B)アクション、これまでに収集された値に対するアクションを記録します。C)状態遷移。
アクションが記述されていない場合、つまり '->'がない場合、デフォルトの暗黙のアクションはNext.NoRecordです。
Line Actions#
アクション | 説明 |
---|---|
Next | 入力行で終了し、次の行を読み取り、状態の最初から照合を再開します。これは、ラインアクションが指定されていない場合のデフォルトの動作です。 |
Continue | 現在の行を保持し、状態の最初のルールからマッチングを再開しないでください。一致が発生しなかったかのようにルールの処理を続行します(値の割り当ては引き続き発生します)。 |
Record Actions#
行アクションがオプションのレコードアクションになった後、これらはピリオド「.」で区切られます。
アクション | 説明 |
---|---|
NoRecord | 何もしない。これは、レコードアクションが指定されていない場合のデフォルトの動作です。 |
Record | これまでに収集された値を1行として戻りデータに記録します。非フィルダウン値はクリアされます。注:割り当てられていない「必須」値がある場合、レコードは出力されません。 |
Clear | フィルダウン以外の値をクリアします。 |
Clearall | すべての値をクリアします。 |
ドット '.' セパレータは、行アクションとレコードアクションの両方が指定されている場合にのみ必要です。一方または両方が暗黙のデフォルトとして残されている場合、ドットは省略されます。つまり、Next、Next.NoRecord、およびNoRecordは同等です。
New State Transition#
アクションの後には、オプションで空白と新しい状態を続けることができます。状態は、予約済み状態の1つ、またはテンプレートで定義された有効な状態である必要があります。一致すると、アクションが正常に実行された後、次の行が入力から読み取られ、現在の状態が新しい状態に変更され、この新しい状態で処理が続行されます。
続行アクションは状態遷移を受け入れないことに注意してください。これにより、ステートマシンがループフリーになります。
エラーアクション 特別なアクション「エラー」があります。このアクションはすべての処理を終了し、テーブルを返さず、これまでに収集されたすべての行を破棄し、例外を発生させます。
このアクションの構文は次のとおりです。