所以,我有一个家庭路由器生成的日志文件。它有数百行。每一行看起来像这样:(下面的长行)。我想解析这个文件以获得所有" 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)
使用Python执行此操作的最佳方法是什么? 最后,我想通过iplookup查询运行这些DST IP地址来获取域名。
我理想的脚本是将时间戳放在开头,SRC地址和DST地址 - 所有这些都分别放入一个字典中,其键是" SRC" ip地址,其对应的值是包含DST地址和时间戳的列表。
我不一定要找一个优雅的剧本,但是有用的东西!
(1)的解决方案已经足够了,但(2)的解决方案将是一个奖励!
答案 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')]