首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在日志文件中搜索给定的字符串IP地址。

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

Stack Overflow用户
提问于 2017-04-13 22:24:57
回答 2查看 78关注 0票数 0

我正在进行一个项目来搜索一个IP地址,看看它是否在日志文件中。我取得了一些很好的进展,但在处理日志文件格式的某些项搜索时,我陷入了困境。

以下是我所拥有的:

代码语言:javascript
复制
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

代码语言:javascript
复制
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(直接连接)开始。

下面是我正在做的事情:

代码语言:javascript
复制
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。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-13 23:34:54

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

代码语言:javascript
复制
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时触发,即没有成功案例。

如果您不能将所有内容读入内存中,您可以像在您的帖子中所做的那样遍历每一行,但是应该可以轻松地完成数千行。

编辑

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2017-04-13 23:39:21

首先,我想提到您处理文件打开和关闭的最初方法(您使用了上下文管理器,"with (.)“(部分)更好。它更干净,防止你忘记再次关闭它。

第二,我会亲自用正则表达式来处理这个问题。如果您知道您将得到相同的模式,首先是D、EX或O等,然后是地址,然后是括号内的部分,那么正则表达式就不会有多大作用,它们绝对值得理解。

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

不同的语言有不同的解释方式。下面是python特性的链接(请记住导入re):https://docs.python.org/3/howto/regex.html

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

总之,我会亲自保留打开文件的初始上下文管理器,然后使用编辑中的readline方法,在其中使用正则表达式从行中提取地址,并将得到的地址放入列表中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43402647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档