将文本文件中的列表与第二个大文本文件进行比较并打印匹配项。

时间:2015-03-25 02:26:18

标签: python

我将防火墙的运行配置保存为文本文件,大小约为67,000行。当我通过此防火墙向我添加新连接时,我需要检查所请求的主机名是否已在此运行配置中使用。该请求有时可能是需要检查的200多个主机名的列表。

我正在尝试编写一个脚本,允许我检查运行配置中任何匹配项的主机名列表,并提供它找到的所有匹配项的输出(到另一个文本文件)。

我遇到的问题是请求中主机的格式类似于“ipdvi.tcif.hhadr.com”,但是在配置中它们存在前缀“object network obj-net-”所以配置中的行将显示为“object network obj-net-ipdvi.tcif.hhadr.com”。因此,我要求脚本只匹配文本字符串的一部分而不是整行。

我没有使用python的经验,但我正试图找到一种方法来避免在文本编辑器中逐个搜索每个主机。

非常感谢任何帮助。

此致 尼克

1 个答案:

答案 0 :(得分:0)

我不确定如何以最快的方式完成此操作,但可以这样做:

首先,读取您的主机名并将其存储在列表中。我假设你的主机名保存在一个单独的文件中,每行一个主机名。

其次,逐行读取防火墙配置,并检查此行中主机名列表中是否有其中一个条目。如果匹配,请存储配置行。

# get hostnames as list
with open('/path/to/hostname_file.txt', 'r') as hosts:
    hostnames = [line.strip() for line in hosts.readlines()]

# read config
with open('/path/to/fw/config.txt', 'r') as fw_config:
    # file where matches are written
    with open('/path/to/matches.txt', 'w+') as match:
        # check config
        for line in fw_config:
            if any(name in line for name in hostnames):
                # write match to file
                match.write(line)

每次执行脚本时都会创建/覆盖结果文件,因此您可能希望备份现有结果文件 - 或更改脚本中的文件名。

更新

根据评论,它只想获得主机名的一个(可能是第一个)匹配。我就是这样做的:

with open('/path/to/hostname_file.txt', 'r') as hosts:
    hostnames = [line.strip() for line in hosts.readlines()]

with open('/path/to/fw/config.txt', 'r') as fw_config:
    with open('/path/to/matches.txt', 'w+') as match:
        for line in fw_config:
            if len(hostnames) < 1:
                break
            if any(name in line for name in hostnames):
                match.write(line)
                hostnames.remove(name)

与之前几乎相同,但现在从列表中删除了匹配的主机名。这样,下一行的下一次检查就不再存在了。

这也意味着主机名列表正在缩小。任何匹配都将被删除,在匹配每个名称后,hostnames只是一个空列表。这就是为什么在查找主机名之前,检查是否还有任何名称。如果没有,循环和代码就存在了 - 在为每个主机名得到结果之后,没有别的事情要做。

当然,这也应该比以前的脚本更快。