Проанализируйте вывод cli 'show proc cpu history' в файл csv (с использованием TextFSM и т. д.)
Кто-нибудь знает, как прочитать эту таблицу и разобрать в файл CSV или что-то. Мне нужно преобразовать его в график (если это возможно).
Я действительно запутался, как читать эту таблицу, а не как "показывать инвентарь" или "показывать версию", там есть шаблон TextFSM для анализа данных, как насчет "истории процессора show proc", там есть шаблон TextFSM или что-то еще?
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
обычно может быть установлен с использованием:
pip install matplotlib