【问题标题】:Regex code to parse full Iptables log Python用于解析完整 Iptables 日志 Python 的正则表达式代码
【发布时间】:2019-08-09 05:44:56
【问题描述】:

我在 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')] 

日志字符串:

8 月 13 日 17:16:33 app-srv01 内核: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 谢谢

【问题讨论】:

  • 请包括预期的输出。

标签: python regex iptables python-iptables


【解决方案1】:

如果您希望日期在开始(而其他 2 个不像 cmets 中最重要)并且您希望从当前模式中匹配,您可以使用 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')]

【讨论】:

  • 嗨,日期也可以与其他参数分开,因为日期对我来说很关键。
  • @dmrpy 您想从Aug 13 17:16:33 app-srv01 kernel: newConnection - IN 中排除日期吗?它应该/看起来像什么?
  • 不,我需要将数据分成一组,因为日期对我来说很关键。我输入了预期的输出。
【解决方案2】:

您可以使用 re.split 来做到这一点,在 abc=def 之前使用一个空格作为分隔符,然后在等号上再次拆分每个项目:

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

【讨论】:

  • 嗨,这很好用,[['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']].. 但是 app-srv01 内核的单独日期“Aug 13 17:16:33”可能是:newConnection - ?因为日期对我来说是一个关键。其他参数如 app-srv01 和 newconnection 不是最重要的
  • @dmrpy:是的,第二次“手动”完成。
猜你喜欢
  • 1970-01-01
  • 2013-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-12
  • 1970-01-01
相关资源
最近更新 更多