解析完整Iptables日志Python的Regex代码

2024-04-30 04:49:07 发布

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

我有这个字符串在iptables日志下面,我想解析完整的内容。 我的实际正则表达式解析90%,但我需要所有的内容日志。你知道吗

我的python正则表达式:

regex = re.compile('([^ ]+)=([^ ]+)')

我也需要这个参数:

Aug 13 17:16:33 app-srv01 kernel: newConnection -

正则表达式结果:

[('IN', 'eth0'), ('MAC', '56:00:01:a1:5c:b7:fe:00:01:a1:5c:b7:08:00'), ('SRC', '91.103.125.80'), ('DST', '45.33.223.166'), ('LEN', '52'), ('TOS', '0x00'), ('PREC', '0x00'), ('TTL', '113'), ('ID', '21200'), ('PROTO', 'TCP'), ('SPT', '55743'), ('DPT', '445'), ('WINDOW', '8192'), ('RES', '0x00'), ('URGP', '0')] 

日志字符串:

Aug 13 17:16:33 app-srv01 kernel: newConnection - IN=eth0 OUT= MAC=56:00:01:a1:5c:b7:fe:00:01:a1:5c:b7:08:00 SRC=91.103.125.80 DST=45.33.223.166 LEN=52 TOS=0x00 PREC=0x00 TTL=113 ID=21200 DF PROTO=TCP SPT=55743 DPT=445 WINDOW=8192 RES=0x00 SYN URGP=0

预期输出:

[('Aug 13 17:16:33'), ('app-srv01 kernel:'), ('newConnection -'), 
('IN', 'eth0'), ('MAC', '56:00:01:a1:5c:b7:fe:00:01:a1:5c:b7:08:00'), ('SRC', 
'91.103.125.80'), ('DST', '45.33.223.166'), ('LEN', '52'), ('TOS', '0x00'), ('PREC', 
'0x00'), ('TTL', '113'), ('ID', '21200'), ('PROTO', 'TCP'), ('SPT', '55743'), ('DPT', 
'445'), ('WINDOW', '8192'), ('RES', '0x00'), ('URGP', '0')] 

有些人可以帮忙。我在用Python3谢谢


Tags: insrcapplenmaca1kernelaug
2条回答

你可以用它来做重新拆分,使用abc=def前面的空格作为分隔符,然后等号上的每一项拆分一秒:

[x.split('=') for x in re.split(r' (?=\S+=)', s)]

如果希望日期在开始处(其他2个不是注释中最重要的),并且希望匹配当前模式,可以使用alternation

^([a-zA-Z]+ \d{1,2} \d{1,2}:\d{1,2}:\d{1,2})|([^ ]+)=([^ ]+)
  • ^字符串的开头
  • ([a-zA-Z]+ \d{1,2} \d{1,2}:\d{1,2}:\d{1,2})捕获组1,匹配“类似日期”的模式
  • |
  • ([^ ]+)=([^ ]+)捕捉第2组和第3组中的值的初始模式

Regex demo| Python demo

例如

import re
regex = r"^([a-zA-Z]+ \d{1,2} \d{1,2}:\d{1,2}:\d{1,2})|([^ ]+)=([^ ]+)"     
test_str = "Aug 13 17:16:33 app-srv01 kernel: newConnection - IN=eth0 OUT= MAC=56:00:01:a1:5c:b7:fe:00:01:a1:5c:b7:08:00 SRC=91.103.125.80 DST=45.33.223.166 LEN=52 TOS=0x00 PREC=0x00 TTL=113 ID=21200 DF PROTO=TCP SPT=55743 DPT=445 WINDOW=8192 RES=0x00 SYN URGP=0"

print(list(map(lambda x: tuple(filter(None, x)), re.findall(regex, test_str))))

结果

[('Aug 13 17:16:33',), ('IN', 'eth0'), ('MAC', '56:00:01:a1:5c:b7:fe:00:01:a1:5c:b7:08:00'), ('SRC', '91.103.125.80'), ('DST', '45.33.223.166'), ('LEN', '52'), ('TOS', '0x00'), ('PREC', '0x00'), ('TTL', '113'), ('ID', '21200'), ('PROTO', 'TCP'), ('SPT', '55743'), ('DPT', '445'), ('WINDOW', '8192'), ('RES', '0x00'), ('URGP', '0')]

相关问题 更多 >