はじめに
ネットワーク機器の 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"
}
}
]