如何使用python解析tcpdump文件

时间:2017-10-29 03:41:48

标签: python parsing tcp tcpdump

我有一个我要解析的tcpdump文件。 tcpdump文件看起来像这样

23:31:54.380799 IP 192.140.3.20.38373 > 240.240.255.250.8082: UDP, length 542

我想解析文件以获取源IP,目标IP和数据包的总大小,并将其存储到列表中。

如何让输出看起来像这样:

[192.140.3.20.38,240.240.255.250.80,542]

3 个答案:

答案 0 :(得分:0)

您可以使用正则表达式来实现它。请尝试以下

#Take the value in a string
string = """23:31:54.380799 IP 192.140.3.20.38373 > 240.240.255.250.8082: UDP, length 542"""

#import regular expression module
import re



#Retrieve source and destination ip
output = re.findall(r"\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b", string)

#packet size
output.append(re.sub(r'.*length(.*)',r'\1',string))

#required info is in output


print output

答案 1 :(得分:0)

pyparsing经常被忽视,作为编写可以高度可读的解析器的一种方式 - 快速。

在这种情况下,time表示每个tcpdump行开头的语法元素。 address表示每个TCP地址。 pp.Literal被不同地用于呈现诸如' IP'例如,'>'我已使用suppress方法省略了输出中不需要的项目。

我处理的文件是你的行重复了大约十次,每行只增加了最后一个常量。

>>> import pyparsing as pp
>>> time = pp.Word(pp.nums + '.:')
>>> address = pp.Word(pp.nums + '.')
>>> line = time.suppress() + pp.Literal('IP').suppress() + address + pp.Literal('>').suppress() + address + pp.Literal(':').suppress() + pp.Literal('UDP,').suppress() + pp.Literal('length').suppress() + pp.Word(pp.nums)
>>> with open('temp.txt') as lines:
...     for a_line in lines:
...         print (line.parseString(a_line).asList())
...         
['192.140.3.20.38373', '240.240.255.250.8082', '542']
['192.140.3.20.38373', '240.240.255.250.8082', '543']
['192.140.3.20.38373', '240.240.255.250.8082', '544']
['192.140.3.20.38373', '240.240.255.250.8082', '545']
['192.140.3.20.38373', '240.240.255.250.8082', '546']
['192.140.3.20.38373', '240.240.255.250.8082', '547']
['192.140.3.20.38373', '240.240.255.250.8082', '548']
['192.140.3.20.38373', '240.240.255.250.8082', '549']
['192.140.3.20.38373', '240.240.255.250.8082', '550']

答案 2 :(得分:0)

这可以使用正则表达式来实现:

import re
data = "23:31:54.380799 IP 192.140.3.20.38373 > 240.240.255.250.8082: UDP, length 542\n" * 2
print(re.findall(r"[^ ]* IP (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}).\d+ > (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}).\d+:.*, length (\d+)", data))

输出:

[('192.140.3.20', '240.240.255.250', '542'),
 ('192.140.3.20', '240.240.255.250', '542')]

(我已将输出与描述匹配,而不是完全匹配您完全不了解的示例输出。)