はじめに
ネットワーク機器の show コマンドのパーサーとして TextFSM や TTP (Template Text Parser) を使い分けています。
個人的には TTP が直感的に使える一方で、ちょっとしたことでつまずくことがあります。
例えば今回紹介する、スペースを含めて値を取得する場合です。
何も考えずにやると・・
例えば以下のコンフィグがある場合、
interface GigabitEthernet0/0 description kingyo ugui oikawa negotiation auto
なんとなくで、以下のテンプレートにすると
<group name="interfaces"> interface {{ interface }} description {{ description }} </group>
以下の結果になります。description
が拾えてません。マッチしていないためです。
[ { "interfaces": { "interface": "GigabitEthernet0/0" } } ]
description kingyo
のような値であれば単純なテンプレートで取得できるのですが。
| re(".+")
を添える
re
を使って、スペースでもマッチする正規表現を指定します。
<group name="interfaces"> interface {{ interface }} description {{ description | re(".+") }} </group>
これで、スペース含めて取得できます。
[ { "interfaces": { "description": "kingyo ugui oikawa", "interface": "GigabitEthernet0/0" } } ]
公式ドキュメントの例 の例を参考にしました。
(おまけ) ignore(".+") だと
<group name="interfaces"> interface {{ interface }} description {{ description }} {{ ignore(".+") }} </group>
だと、以下のように、スペースで区切られた値の最初のところだけしか取得できません。
[ { "interfaces": { "description": "kingyo", "interface": "GigabitEthernet0/0" } } ]