解析cli输出'show proc cpu history'到文件csv(使用TextFSM等)

时间:2017-05-17 11:24:06

标签: python csv matplotlib python-textfsm

有谁知道如何阅读此表并解析为CSV文件或其他内容。 我需要将其转换为图形(如果可能)。

我真的很困惑如何阅读这个表,不像'show inventory'或'show version'那里有一个TextFSM模板来解析数据,'show proc cpu history'怎么样有TextFSM模板或什么?< / p>

显示proc cpu历史记录(来自show tech.txt) enter image description here

1 个答案:

答案 0 :(得分:0)

您需要读取文本文件并提取包含数值的每个图形上方的3行。这些需要“旋转”并转换为整数。

以下代码将读取文本文件并提取必要的行。它首先跳过所有初始行,直到找到三个图的标题行。

它旋转值(使用*zip(*data))。接下来,它根据源文件名将数据写入三个单独的CSV文件。

最后,它使用数据显示使用Python matplotlib库(需​​要安装)的三个图形。

from itertools import dropwhile, takewhile, izip_longest
import matplotlib.pyplot as plt
import csv
import re
import os
from collections import deque

def process_block(block):
    # Determine number of leading spaces (varies between files)
    start_offset = min(len(block[0]) - len(block[0].lstrip()), len(block[1]) - len(block[1].lstrip()))
    # Extract just data. Skip over leading spaces, remove trailing newline and replace any spaces with 0
    block = [line[start_offset:].rstrip('\n').replace(' ', '0') for line in block]
    # Convert to values
    return [int(''.join(entry)) for entry in zip(*block)]


def process_switch_file(figure, switch_filename):

    with open(switch_filename) as f_input:
        # Extract just the graph lines
        lines = list(takewhile(lambda x: "- show logging -" not in x, dropwhile(lambda x: "- show process cpu history -" not in x, f_input)))

    headings = ["CPU% per second (last 60 seconds)", "CPU% per minute (last 60 minutes)", "CPU% per hour (last 72 hours)"]

    # Keep reading each until a line starting 100 is found, keep the previous 2 lines
    data = []
    entry = iter(lines)

    while True:
        block = deque(takewhile(lambda x: not re.match(' *?100 ', x), entry), 2)

        if len(block[0]) <= 1:
            break
        data.append(block)

    data = [process_block(block) for block in data]
    x_values = [range(0, len(block)) for block in data]

    # Get the base filename (without path or extension)
    csv_filename = os.path.splitext(os.path.basename(switch_filename))[0]

    # Write data to a csv
    with open('{}_cpu_seconds.csv'.format(csv_filename), 'wb') as f_output:
        csv_output = csv.writer(f_output)
        csv_output.writerow(['Second', 'Value'])
        csv_output.writerows(list(zip(x_values[0], data[0])))

    with open('{}_cpu_minutes.csv'.format(csv_filename), 'wb') as f_output:
        csv_output = csv.writer(f_output)
        csv_output.writerow(['Minute', 'Value'])
        csv_output.writerows(list(zip(x_values[1], data[1])))

    with open('{}_cpu_hours.csv'.format(csv_filename), 'wb') as f_output:
        csv_output = csv.writer(f_output)
        csv_output.writerow(['Hour', 'Value'])
        csv_output.writerows(list(zip(x_values[2], data[2])))

    fig = plt.figure(figure)
    fig.canvas.set_window_title(csv_filename)

    for subplot, x, block, heading in zip(range(311, 314), x_values, data, headings):
        # Display as graphs
        ax = fig.add_subplot(subplot)
        ax.set_xlabel(heading)
        ax.set_ylim(0, 100)
        plt.plot(x, block)

    plt.tight_layout()


for figure, filename in enumerate(['switch-2.txt', "switch-3.txt", "Switch.txt"], start=1):
    process_switch_file(figure, filename)

plt.show()

CSV文件将启动如下:

Minute,Value
0,0
1,0
2,0
3,0
4,3
5,11

显示屏会显示:

matplotlib graphs

matplotlib通常可以使用以下方式安装:

pip install matplotlib