2010-11-03 177 views
1

我使用tcpdump来嗅探我的netwrok数据包,并且我想从存储的文件中获取一些信息。我的文件在语法上有2个分隔的行,但它们重复了很多次。在python中使用readline()从正则表达式获取一些子字符串

23:30:43.170344 IP (tos 0x0, ttl 64, id 55731, offset 0, flags [DF], proto TCP (6), length 443) 

192.168.98.138.49341 > 201.20.49.239.80: Flags [P.], seq 562034569:562034972, ack 364925832, win 5840, length 403 

我想时间戳(23:30:43.170344)和ID(编号55731)和偏移(23:30:43.170344)从第一行(全部行这样对我文件)。并存储在不同的列表中。

和得到2 分隔的IP(192.168.98.138.49341和201.20.49.239.80)和SEQ(SEQ 562034569:562034972)和ACK(ACK 364925832)从第二(所有线这样上我的文件)行和存储在不同的列表中。

如果可以用正则表达式做到这一点,那对我更好。

回答

2

第一部分,获取时间戳,ID和偏移量。

我相信这是一个粗糙的正则表达式。

>>> import re 
>>> l = '23:30:43.170344 IP (tos 0x0, ttl 64, id 55731, offset 0, flags [DF], proto TCP (6), length 443)' 
>>> k = re.compile(r'^([0-9:]+\.[0-9]+) IP \(.* id ([0-9]+), offset ([0-9]+).*\)') 
>>> x = k.match(l) 
>>> x.groups() 
('23:30:43.170344', '55731', '0') 
>>> x.groups()[0] 
'23:30:43.170344' 
>>> x.groups()[1] 
'55731' 
>>> x.groups()[2] 
'0' 
>>> 

对于第二部分:

>>> l = '192.168.98.138.49341 > 201.20.49.239.80: Flags [P.], seq 562034569:562034972, ack 364925832, win 5840, length 403' 
>>> k = re.compile(r'^([0-9.]+) > ([0-9.]+): .* seq ([0-9:]+), ack ([0-9]+).*') 
>>> x = k.match(l) 
>>> for y in x.groups(): print y 
... 
192.168.98.138.49341 
201.20.49.239.80 
562034569:562034972 
364925832 

对于读了重新模块:

+0

坦的回答却怎么也告诉Python做这只是我的奇数或偶数行。我也喜欢(id 55731)和(偏移0),我怎样才能为第二行写正则表达式? – Am1rr3zA 2010-11-03 08:35:04

+0

@ Am1rr3zA:将每一行与编译后的正则表达式对象进行匹配。如果该行不匹配,则不返回,否则返回可从中提取信息的匹配对象。 – pyfunc 2010-11-03 08:37:12

相关问题