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

2024-09-29 21:53:18 发布

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

我将防火墙的运行配置保存为一个长度约为67000行的文本文件。当我请求通过这个防火墙添加新的连接时,我需要检查请求的主机名是否已经在这个正在运行的配置中使用。请求有时可能是需要检查的200多个主机名的列表

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

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

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

任何帮助都将不胜感激

敬礼 尼克


Tags: 脚本comobj列表netobject格式network
1条回答
网友
1楼 · 发布于 2024-09-29 21:53:18

我不知道如何以最快的方式完成,但可以这样做:

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

其次,逐行阅读防火墙配置,并检查这一行的主机名列表中是否有一个条目。如果存在匹配项,则存储配置行

# 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只是一个空列表。这就是为什么在寻找主机名之前,会先检查是否还有剩余的主机名。如果没有,循环和代码就存在了——在每个主机名都有一个结果之后,就没有别的事情可做了

当然,这也应该比上一个脚本快得多

相关问题 更多 >

    热门问题