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

时间:2017-04-13 22:24:57

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

我正在开发一个搜索IP地址并查看它是否在日志文件中的项目。我在处理以日志文件格式搜索某些项目时遇到了一些好的进展但却陷入困境。

这就是我所拥有的:

.toggle_menu{
  position: fixed;
  padding: 15px 20px 15px 15px;
  margin-top: 70px;
  color: white;
  cursor: pointer;
  background-color: #648B79;
  z-index: 1000000;
}
.toggle_menu:before {
  font-size: 8em;
}

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

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

https://pastebin.com/ff40sij5

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

例如,对于这一行,所有关心的护理都是 10.20.70.0/23

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"

请帮忙。

由于 戴蒙

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

以下是我正在做的事情:

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

这给了我一些更清晰的结果,但仍然是整行,而不仅仅是IP。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

其次,我会亲自用正则表达式来解决这个问题。如果你知道你将从D EX或O等开始获得相同的模式,然后是一个地址,然后是括号内的部分,那么正则表达式应该不会有多大工作,而且他们会#39 ;绝对值得了解。

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

不同的语言有不同的方式来解释模式。这里有一个python细节链接(记得导入重新编写):https://docs.python.org/3/howto/regex.html

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

总结一下,我个人保留初始上下文管理器来打开文件,然后使用编辑中的readlines方法,在里面,使用正则表达式从行中获取地址,并坚持下去您返回列表的地址。