在logfi中搜索给定的字符串IPaddress

2024-04-26 20:23:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在做一个项目,搜索一个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。你知道吗


Tags: 文件项目iniptxtiflinepr
2条回答

首先,我要提到的是,您最初处理文件打开和关闭的方式(使用上下文管理器时,“with open(…)”部分)更好。它更干净,防止你忘记再关上它。你知道吗

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

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

不同的语言有不同的方式来解释模式。这里有一个python的链接(记住导入re):https://docs.python.org/3/howto/regex.html

还有一个名为regexr的网站(我没有足够的声誉来建立另一个链接),你可以用它来处理表达式。你知道吗

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

你需要自己存储所有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

相关问题 更多 >