在日志文件中搜索给定的字符串 IP 地址



我正在做一个项目来搜索IP地址,看看它是否在日志文件中。 我取得了一些不错的进展,但在处理以日志文件格式搜索某些项目时遇到了困难。

这是我所拥有的:

IP = raw_input('Enter IP Address:')
with open ('RoutingTable.txt', 'r') as searchIP:
for line in searchIP:
if IP in line:
ipArray =  line.split()
print ipArray
if IP == ipArray[0]:
print "Success"
else:
print "Fail"

如您所见,这是非常糟糕的代码,但我是 Python 和编程的新手,所以我使用它来确保我至少可以打开文件并将第一项与我输入的字符串进行比较。

她是一个示例文件内容(我的实际文件有数千个条目):

https://pastebin.com/ff40sij5

我想要一种方法将所有 IP(只是 IP 而不是其他垃圾)存储在一个数组中,然后循环遍历数组中的所有项目并与用户定义的 IP 进行比较。

例如,对于此行,所有关心的是10.20.70.0/23

D EX    10.20.70.0/23 [170/3072] via 10.10.10.2, 6d06h, Vlan111
[170/3072] via 10.10.10.2, 6d06h, Vlan111
[170/3072] via 10.10.10.2, 6d06h, Vlan111
[170/3072] via 10.10.10.2, 6d06h, Vlan111

请帮忙。

谢谢 达蒙

编辑:我正在挖掘设置标志,但这仅适用于某些情况,因为您可以看到所有行都不以 D 开头,但有些行以 O(用于 OSFP 路由)和 C(直接连接)开头。

以下是我正在做的事情:

f = open("RoutingTable.txt")
Pr = False
for line in f.readlines():
if Pr: print line
if "EX" in line:
Pr = True
print line
if "[" in line:
Pr = False
f.close()

这给了我一个更干净的结果,但仍然是整条线,而不仅仅是IP。

你一定需要自己存储所有的IP吗?您可以执行以下操作,将所有数据抓取到列表中,并检查输入字符串是否位于列表中:

your_file = 'RoutingTable.txt'
IP = input('Enter IP Address:')
with open(your_file, 'r') as f:
data = f.readlines()
for d in data:
if IP in d:
print 'success'
break
else:
print 'fail'

else语句仅在您不break时触发,即没有成功案例。

如果您无法将所有内容读入内存,您可以像在帖子中一样迭代每一行,但数千行应该很容易做到。


编辑

import re
your_file = 'RoutingTable.txt'
ip_addresses = []
IP = input('Enter IP Address:')
with open(your_file, 'r') as f:
data = f.readlines()
for d in data:
res = re.search('(d+.d+.d+.d+/d+)', d)
if res:
ip_addresses.append(res.group(1))
for ip_addy in ip_addresses:
if IP == ip_addy:
print 'success'
break
else:
print 'fail'
print ip_addresses

首先,我想提一下您处理文件打开和关闭的初始方式(您使用上下文管理器的地方,"with open(..)" 部分)更好。它更干净,可以防止您忘记再次关闭它。

其次,我个人会用正则表达式来处理这个问题。如果你知道你会得到相同的模式,从D EX或O等开始,然后是一个地址,然后是括号部分,正则表达式应该不会有太多工作,它们绝对值得理解。

这是了解它们的好资源:http://regular-expressions.mobi/index.html?wlr=1

不同的语言有不同的方法来解释模式。这是python细节的链接(记得导入re):https://docs.python.org/3/howto/regex.html

还有一个名为regexr的网站(我对另一个链接没有足够的声誉),您可以使用它来弄乱表达式以掌握它。

总而言之,我个人会保留用于打开文件的初始上下文管理器,然后使用编辑中的 readlines 方法,在其中,使用正则表达式从行中获取地址,并将您获得的地址粘贴回列表中。

最新更新