用于解析完整 Iptables 日志的正则表达式代码 Python
Regex code to parse full Iptables log 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 谢谢
您可以使用 re.split 来做到这一点,在 abc=def 之前使用 space 作为分隔符,然后再次拆分每个项目等号:
[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,匹配 "date like" 模式
|
或
([^ ]+)=([^ ]+)
您的初始模式捕获第 2 组和第 3 组中的值
例如
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')]
我在 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 谢谢
您可以使用 re.split 来做到这一点,在 abc=def 之前使用 space 作为分隔符,然后再次拆分每个项目等号:
[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,匹配 "date like" 模式|
或([^ ]+)=([^ ]+)
您的初始模式捕获第 2 组和第 3 组中的值
例如
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')]