Проанализируйте вывод cli 'show proc cpu history' в файл csv (с использованием TextFSM и т. д.)

Кто-нибудь знает, как прочитать эту таблицу и разобрать в файл CSV или что-то. Мне нужно преобразовать его в график (если это возможно).

Я действительно запутался, как читать эту таблицу, а не как "показывать инвентарь" или "показывать версию", там есть шаблон TextFSM для анализа данных, как насчет "истории процессора show proc", там есть шаблон TextFSM или что-то еще?

показать историю процессора (из show tech.txt) введите описание изображения здесь

1 ответ

Вам нужно прочитать текстовый файл и извлечь 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

matplotlib обычно может быть установлен с использованием:

pip install matplotlib
Другие вопросы по тегам