【问题标题】:Searching for a given string IP-address in a logfile在日志文件中搜索给定的字符串 IP 地址
【发布时间】:2017-09-10 04:31:48
【问题描述】:

我正在做一个项目来搜索 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。

【问题讨论】:

  • 严格来说,这里的问题是解析您的日志文件格式。我相应地标记并重新命名。如果您告诉我们更多有关日志文件格式的信息,它是什么名称/包/工具,可能会有所帮助?

标签: python python-2.7 parsing ip-address logfile


【解决方案1】:

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

【讨论】:

  • 这完美!请参阅下面的帖子,了解我决定保存它们的原因。我的回复太长,无法发表评论,因此我将其发布为答案。
  • @Damon - 很酷,我还添加了一个使用re 模块保存所有IP 地址的编辑。你应该为未来考虑。如果我的帖子回答了您最初的问题,请接受它:)
  • 感谢您的快速和出色的响应.. 问题已解决 ,,, 查找我的新帖子以构建子网划分逻辑 :)
【解决方案2】:

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

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

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

不同的语言有不同的方式来解释模式。这是一个关于它的 python 细节的链接(记得 import re):https://docs.python.org/3/howto/regex.html

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-10
    • 1970-01-01
    • 2013-02-11
    • 1970-01-01
    • 2020-01-02
    • 2011-11-19
    • 2012-03-10
    • 1970-01-01
    相关资源
    最近更新 更多