我使用var minute = Number(document.getElementById('autoDropDown').value);
将54,000行日志导入Python。我需要从日志中提取可变数量的行来捕获服务器make和固件版本。例如,以下是日志中的3行:
readlines()
# racadm getversion
<Server> <iDRAC Version> <Blade Type> <Gen> <Updatable>
server-1 1.57.57 (Build 04) PowerEdge M620 iDRAC7 Y
server-2 1.57.57 (Build 04) PowerEdge M620 iDRAC7 Y
仅在日志中出现一次。可列出1台服务器到32台服务器。我需要解析此日志以捕获iDRAC版本和服务器版本,然后将其保存到我的刀片类(racadm getversion
,self.iDRAC
)的类属性中。还有其他我需要捕捉的东西,但我应该能够应用同样的概念。
我怎么能添加一行来说明(以下不是我的实际代码,只是一个粗略的例子):
self.model
答案 0 :(得分:0)
您的问题有点不清楚,但这是否在正确的位置?
简而言之,我不知道您是使用制表符还是四个连续空格来分隔字段,因此我使用正则表达式(\s{4}|\t)
处理这两种情况。如果需要,您可以更改此内容。
import re
DATA = \
"""<Server> <iDRAC Version> <Blade Type> <Gen> <Updatable>
server-1 1.57.57 (Build 04) PowerEdge M620 iDRAC7 Y
server-2 1.57.57 (Build 04) PowerEdge M620 iDRAC7 Y"""
class Blade(object):
def __init__(self, model, idrac):
self.model = model
self.idrac = idrac
def __repr__(self):
return 'Blade (model={}, idrac={})'.format(self.model, self.idrac)
def parse_data(data):
for line in data.splitlines()[1:]:
model, idrac = re.split(r'(\s{4}|\t)', line)[:2]
yield Blade(model, idrac)
if __name__ == '__main__':
for blade in parse_data(DATA):
print(blade)
<强>输出强>
Blade (model=server-1, idrac=1.57.57 (Build 04))
Blade (model=server-2, idrac=1.57.57 (Build 04))
答案 1 :(得分:0)
一旦你有这样的一行
server-1 1.57.57 (Build 04) PowerEdge M620 iDRAC7 Y
您可以使用split()
将每个部分分隔到数组中。默认情况下,split()
会将字符串与任何空格分开。但看起来你的字符串中有一些字段中有空格。你可以将它分割成一个标签(如果这就是字符串的分隔方式),就像这样:
for line in cmclist:
separated=line.split("\t")
version=separated[1]
这里line.split("\t")
应该给你:
["server-1", "1.57.57 (Build 04)", "PowerEdge M620", "iDRAC7", "Y"]
您可以详细了解split()
here。
答案 2 :(得分:0)
您对next
电话有正确的想法。为列表创建一个迭代器,然后使用for
,next
或itertools
中的帮助程序来运行它。迭代器记住它们的位置,所以如果你提前退出循环,它们只需重新启动下一个项目。以下是itertools
的几个示例。第二个使用yield from
这是一个python 3的东西。
import itertools
cmclog = """other stuff
other stuff
# racadm getversion
<Server> <iDRAC Version> <Blade Type> <Gen> <Updatable>
server-1 1.57.57 (Build 04) PowerEdge M620 iDRAC7 Y
server-2 1.57.57 (Build 04) PowerEdge M620 iDRAC7 Y
other stuff
other stuff""".split("\n")
def scan_server_list(cmclog):
server_list = []
icmc = iter(cmclog)
try:
# drop everything through the racadm sentinal
next(itertools.dropwhile(
lambda line: not line.startswith("# racadm getversion"),
icmc))
# skip header
next(icmc)
# take all servers
server_list.extend(itertools.takewhile(
lambda line: line.startswith("server-"),
icmc))
except StopIteration:
pass
return server_list
print(scan_server_list(cmclog))
def scan_server_list_2(cmclog):
icmc = iter(cmclog)
# drop everything through the racadm sentinal
next(itertools.dropwhile(
lambda line: not line.startswith("# racadm getversion"),
icmc))
# skip header
next(icmc)
# take all servers
yield from itertools.takewhile(
lambda line: line.startswith("server-"),
icmc)
print(list(scan_server_list_2(cmclog)))