正则表达式解析日志文件

2024-05-29 03:45:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个SonicWall系统日志文件,格式如下:

<134>id=firewall sn=C0EAE470F7D0 time="2014-08-13 04:31:27" fw=10.2.3.4 pri=6 c=1024 m=537 msg="Connection Closed" n=301541 src=172.16.1.43:50581:X0 dst=172.16.1.1:192:X0 proto=udp/192 sent=46

我正在尝试创建一个正则表达式,该表达式将返回在=号上拆分的元组列表。如果一个值包含空格,它将有双引号。我不在乎返回的值是否返回引号,只要返回的是带空格的整个值。例如,我希望时间键同时包含日期和时间。期望输出:

("<134>id","firewall"), ("sn","C0EAE470F7D0"), ("time", '"2014-08-13 04:31:27"')
("fw","1.2.3.4"), ("pri","6"), ... ("msg", '"Connection Closed"'), ("n", "301541")
("src","172.16.1.43:50581:X0"), ... ("sent", "46")

这是我目前所拥有的,但是当遇到带双引号的字段时失败。另外,在本例中,最后一个字段“sent”不会返回。我已经用RE做了几个小时的试验,尝试各种组合,但是还不能完全实现。任何帮助都将不胜感激。

import re
fname = "syslog.log"
with open(fname) as fp: lines = fp.read().splitlines()
q = re.compile('(.*?)=(.*?)[\s"]',re.S|re.M)
for line in lines:
    print(line)
    key_val = q.findall(line)
    print(key_val)

这是此代码返回的结果:

[('<134>id', 'firewall'), ('sn', 'C0EAE470F7D0'), ('time', ''), 
('2014-08-13 04:31:27" fw', '10.2.3.4'), ('pri', '6'),
('c', '1024'), ('m', '537'), ('msg', ''), 
('Connection Closed" n', '301541'), ('src', '172.16.1.43:50581:X0'), 
('dst', '172.16.1.1:192:X0'), ('proto', 'udp/192')]

如果不能用正则表达式来实现这一点,那么在Python3.3中,实现所需结果的最佳方法是什么?


Tags: resrcidtimelinemsgconnectionsent

热门问题