如何使用Python从系统日志文件中获取DST地址

时间:2012-12-10 22:00:07

标签: python parsing

所以,我有一个家庭路由器生成的日志文件。它有数百行。每一行看起来像这样:(下面的长行)。我想解析这个文件以获得所有" DST"地址。例如,从下面一行开始,DST地址为" 16.99.99.102"

Dec 10 16:02:02 ? user.warn kernel: DROP IN=br0 OUT=vlan1 SRC=192.168.1.127 DST=16.99.99.102 LEN=52 TOS=0x00 PREC=0x00 TTL=127 ID=24724 DF PROTO=TCP SPT=62694 DPT=443 WINDOW=8192 RES=0x00 SYN URGP=0 OPT (020405B40103030201010402) 
  1. 使用Python执行此操作的最佳方法是什么? 最后,我想通过iplookup查询运行这些DST IP地址来获取域名。

  2. 我理想的脚本是将时间戳放在开头,SRC地址和DST地址 - 所有这些都分别放入一个字典中,其键是" SRC" ip地址,其对应的值是包含DST地址和时间戳的列表。

  3. 我不一定要找一个优雅的剧本,但是有用的东西!

    (1)的解决方案已经足够了,但(2)的解决方案将是一个奖励!

3 个答案:

答案 0 :(得分:0)

这适合你吗?

In [30]: somestr = "Dec 10 16:02:02 ? user.warn kernel: DROP IN=br0 OUT=vlan1 SRC=192.168.1.127 DST=16.99.99.102 LEN=52 TOS=0x00 PREC=0x00 TTL=127 ID=24724 DF PROTO=TCP SPT=62694 DPT=443 WINDOW=8192 RES=0x00 SYN URGP=0 OPT (020405B40103030201010402)"

In [31]: somestr.split()
Out[31]: 
['Dec',
 '10',
 '16:02:02',
 '?',
 'user.warn',
 'kernel:',
 'DROP',
 'IN=br0',
 'OUT=vlan1',
 'SRC=192.168.1.127',
 'DST=16.99.99.102',
 'LEN=52',
 'TOS=0x00',
 'PREC=0x00',
 'TTL=127',
 'ID=24724',
 'DF',
 'PROTO=TCP',
 'SPT=62694',
 'DPT=443',
 'WINDOW=8192',
 'RES=0x00',
 'SYN',
 'URGP=0',
 'OPT',
 '(020405B40103030201010402)']

In [32]: [i for i in somestr.split() if i.startswith("DST")][0].partition('=')[-1]
Out[32]: '16.99.99.102'

答案 1 :(得分:0)

对于选项A: 如果所有行都采用相同的格式(和顺序),则可以对每一行进行子串:

dst = line[line.find("DST=")+len("DST="):line.find("LEN=")]

对于选项B,您可以在循环中遵循相同的想法:

D = {}
for line in lines:
    dst = line[line.find("DST=")+len("DST="):line.find("LEN=")]
    src = line[line.find("SRC=")+len("SRC="):line.find("DST=")]
    ts = line[:line.find("?")]

    D[src] = (dst,ts)

您还可能需要strip()生成的字符串以获得更清晰的结果。

答案 2 :(得分:0)

我会使用正则表达式

类似

>>> xxy = "Dec 10 16:02:02 ? user.warn kernel: DROP IN=br0 OUT=vlan1 SRC=192.168.1.127 DST=16.99.99.102 LEN=52 TOS=0x00 PREC=0x00 TTL=127 ID=24724 DF PROTO=TCP SPT=62694 DPT=443 WINDOW=8192 RES=0x00 SYN URGP=0 OPT (020405B40103030201010402)"
>>> re.findall("^([^?]*).*DST=([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)",xxy)
[('Dec 10 16:02:02 ', '16.99.99.102')]