Grethon中的Greping

时间:2017-01-05 08:53:06

标签: python

我正在使用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

正则表达式模式与我想要的完全匹配,但它只是从文件中吐出所有信息。

2 个答案:

答案 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文件。