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

Searching for a given string IP-address in a logfile

我正在研究一个搜索 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 进行比较。

比如对于这一行all care care的是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时触发,即没有成功案例。

如果您不能将所有内容读入内存,您可以像在 post 中那样遍历每一行,但是数千行应该很容易做到。


编辑

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

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

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

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