我正在使用linux服务器并存储文件,其中包含有关设备状态的一些信息,如:
TE 20170105 082502000244;DEV My_device;Q Device_IP;HOST lover_case_device_name;L watch;S A+r;SYS uptime;TO 20170105 082502;PRIO 1;VAL 13793460;CNT 0;TR 0,1,300,1,1800,5,0,20;TXT Linux: 00:25:02 up 159 days, 15:31, 0 users, load average: 0.08, 0.07, 0.01;
我想检索标记为Dev(My_device)的标记信息以及与此设备关联的正常运行时间(仅限天数)。正常运行时间为“TXT Linux:00:25:02 up 159天”
我尝试了以下内容:
import re
azf = open('/data/2017/01/05/09.azf')
for line in azf:
line = line.rstrip()
if re.findall('[CFR]{3}[A-Z]{1}[0-9]{5}|[days]{3,}', line) :
print line
正则表达式模式与我想要的完全匹配,但它只是从文件中吐出所有信息。
答案 0 :(得分:2)
if re.findall('[CFR]{3}[A-Z]{1}[0-9]{5}|[days]{3,}', line) :
print line
您的部分问题是您正在打印整条生产线。如果它不是你想要的,那么就不要打印它。 :-)另外,你很可能想要在正则表达式中使用原始字符串,因为它们通常包含反斜杠。
如果你这样做了:
for match in re.findall('[CFR]{3}[A-Z]{1}[0-9]{5}|[days]{3,}', line):
print match
您会看到自己匹配的内容,而且您发现它只是"天"。
我想你想要更像这样的东西:
import re
from pprint import pprint
def read_data(filename):
with open(filename, 'rb') as f:
entries = {}
for line in f:
line = line.rstrip()
# The regex here attempts to match each entry which
# starts off with a sequence of letters and is terminated
# with a semicolon.
for match in re.findall(r'\b[A-Z]* [^;]*', line):
key, value = match.split(' ', 1)
entries[key] = value
return entries
def parse_days(text):
if text:
# To parse the number of days, we group around where
# days is expected to be...
match = re.search(r'up (\d+) days', entries['TXT'])
if match:
# ...and pull the value out if there is a match
return match.group(1)
return None
entries = read_data('data.azf')
# Print the entries
pprint(entries)
# Show the ones we're interested in
print entries['DEV']
print entries['TXT']
if 'TXT' in entries:
# Parse the days
print parse_days(entries['TXT'])
read_data()
将读取文件并将内容解析为条目,因为它们似乎结构良好,并将它们作为字典返回。我不确定是否可以预期不止一条线,但我选择了最新的比赛胜利。
parse_days()
会通过TXT
条目,并会提取天数,如果它在那里,或者返回None
。
这里是给出示例数据的输出:
{'CNT': '0',
'DEV': 'My_device',
'HOST': 'lover_case_device_name',
'L': 'watch',
'PRIO': '1',
'Q': 'Device_IP',
'S': 'A+r',
'SYS': 'uptime',
'TE': '20170105 082502000244',
'TO': '20170105 082502',
'TR': '0,1,300,1,1800,5,0,20',
'TXT': 'Linux: 00:25:02 up 159 days, 15:31, 0 users, load average: 0.08, 0.07, 0.01',
'VAL': '13793460'}
My_device
Linux: 00:25:02 up 159 days, 15:31, 0 users, load average: 0.08, 0.07, 0.01
159
答案 1 :(得分:0)
经过几次测试后,我得到了我想要的东西...... 对于那些不像我这样的python程序员的人来说:)
import re
f = open('/data/2017/01/09/08.azf')
strToSearch = ""
for line in f:
strToSearch += line
patFinder1 = re.compile('(?=([XXX]{3}[A-Z]{1}[0-9]{5}))+.*(\s\w[up]\s\d{1,3})')
findPat1 = re.findall(patFinder1, strToSearch)
for i in findPat1:
print(i)
XXX -my设备名称总是3个相同的字母,只有最后一个字母正在改变。
结果是: ('XXXN02142','up 5')
我的下一步是格式化此打印并写入csv文件。