Skip to content

CLIを解析#

IOS-XR#

IOS XRのshow inventoryコマンドの出力は、以下のような形式で表示されます。

NAME: "Chassis", DESCR: "ASR9K Chassis"
PID: ASR-9006-AC    , VID: V01, SN: FOX1846GJLB

NAME: "module 0/RSP0/CPU0", DESCR: "ASR9K Route Switch Processor"
PID: A9K-RSP880-SE   , VID: V01, SN: FOX18444LZB

NAME: "module 0/0", DESCR: "ASR9K 4x10GE SPA, OTN License"
PID: A9K-40GE-L       , VID: V03, SN: FOX1748G61A

NAME: "module 0/1", DESCR: "ASR9K 4x10GE SPA, OTN License"
PID: A9K-40GE-L       , VID: V03, SN: FOX1748G60P

NAME: "module mau 0/2", DESCR: "10GBASE-SR SFP+ Transceiver Module"
PID: SFP-10G-SR       , VID: V03, SN: FNS18090V2Q

NAME: "module mau 0/3", DESCR: "10GBASE-SR SFP+ Transceiver Module"
PID: SFP-10G-SR       , VID: V03, SN: FNS181205YR

この出力をPythonで解析するために、正規表現を使用してパターンにマッチする行を抽出し、辞書に変換することができます。以下は、パターンに基づいて出力を解析して、辞書に格納するサンプルコードです。

import re

def parse_inventory(output):
    inventory = {}
    pattern = re.compile(r'^NAME:\s+"(?P<name>.*)",\s+DESCR:\s+"(?P<description>.*)"')
    for line in output.splitlines():
        match = pattern.match(line)
        if match:
            device = match.groupdict()
            pid_line = next(filter(lambda x: x.startswith('PID:'), output.splitlines()), None)
            if pid_line:
                device['pid'] = pid_line.split(':', 1)[1].strip()
            vid_line = next(filter(lambda x: x.startswith('VID:'), output.splitlines()), None)
            if vid_line:
                device['vid'] = vid_line.split(':', 1)[1].strip()
            sn_line = next(filter(lambda x: x.startswith('SN:'), output.splitlines()), None)
            if sn_line:
                device['sn'] = sn_line.split(':', 1)[1].strip()
            inventory[device['name']] = device
    return inventory

このコードでは、正規表現パターンを定義し、各行をマッチングします。 マッチした行から必要な情報を抽出して辞書に格納し、最終的に辞書を返します。この例では、各デバイスの名称、説明、PID、VID、SNを辞書に格納しています。

辞書をCSVファイルに書き込むには、Pythonのcsvモジュールを使用します。以下は、先程作成した辞書をCSVファイルに書き込むサンプルコードです。

import csv

def write_to_csv(inventory_dict, output_file):
    with open(output_file, mode='w', newline='') as file:
        writer = csv.writer(file)
        # CSVファイルのヘッダを書き込みます
        writer.writerow(['Name', 'Description', 'PID', 'VID', 'SN'])
        # 辞書の各要素をCSVファイルに書き込みます
        for device in inventory_dict.values():
            writer.writerow([device.get('name', ''),
                             device.get('description', ''),
                             device.get('pid', ''),
                             device.get('vid', ''),
                             device.get('sn', '')])

このコードでは、CSVファイルを作成し、csv.writerオブジェクトを取得しています。CSVファイルのヘッダを書き込み、辞書の各要素をCSVファイルに書き込んでいます。各要素は、リストとしてwriterow()メソッドに渡され、自動的にCSVファイルの1行に書き込まれます。最後に、CSVファイルを閉じます。

使用例:

inventory = {'Chassis': {'name': 'Chassis', 'description': 'ASR9K Chassis', 'pid': 'ASR-9006-AC', 'vid': 'V01', 'sn': 'FOX1846GJLB'},
             'module 0/RSP0/CPU0': {'name': 'module 0/RSP0/CPU0', 'description': 'ASR9K Route Switch Processor', 'pid': 'A9K-RSP880-SE', 'vid': 'V01', 'sn': 'FOX18444LZB'},
             'module 0/0': {'name': 'module 0/0', 'description': 'ASR9K 4x10GE SPA, OTN License', 'pid': 'A9K-40GE-L', 'vid': 'V03', 'sn': 'FOX1748G61A'},
             'module 0/1': {'name': 'module 0/1', 'description': 'ASR9K 4x10GE SPA, OTN License', 'pid': 'A9K-40GE-L', 'vid': 'V03', 'sn': 'FOX1748G60P'},
             'module mau 0/2': {'name': 'module mau 0/2', 'description': '10GBASE-SR SFP+ Transceiver Module', 'pid': 'SFP-10G-SR', 'vid': 'V03', 'sn': 'FNS18090V2Q'},
             'module mau 0/3': {'name': 'module mau 0/3', 'description': '10GBASE-SR SFP+ Transceiver Module', 'pid': 'SFP-10G-SR', 'vid': 'V03', 'sn': 'FNS181205YR'}}
write_to_csv(inventory, 'inventory.csv')