2

我正在使用 SIEM,需要能够从相对较大的文件中解析 IP 地址。他们没有一致的字段,因此“剪切”不是一种选择。我正在使用修改后的 python 脚本来删除除 az AZ 0-9 和句点“。”之外的所有字符。以便可以正确解析文件。问题是这不适用于我的 SIEM 文件。如果我有一个看起来像“192.168.1.2!@#$!@%@$”的文本文件,那很好,它会正确删除我不需要的所有字符,并将 IP 输出到新文件. 问题是,如果文件看起来像这样“192.168.168.168@#$% 这是一个测试”,它会在删除异常字符的第一阶段后不理会它。请帮忙,我不知道为什么会这样。这是我的代码:

    #!/usr/bin/python
    import re
    import sys

    unmodded = raw_input("Please enter the file to parse. Example: /home/aaron/ipcheck: ")
    string = open(unmodded).read()
    new_str = re.sub('[^a-zA-Z0-9.\n\.]', ' ', string)
    open('modifiedipcheck.txt', 'w').write(new_str)

    try:
        file = open('modifiedipcheck.txt', "r")
        ips = []
        for text in file.readlines():
            text = text.rstrip()
            regex = re.findall(r'(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:    [\d]{1,3})$',text)
            if regex is not None and regex not in ips:
                ips.append(regex)
         for ip in ips:
            outfile = open("checkips", "a")
            combine = "".join(ip)
            if combine is not '':
                print "IP: %s" % (combine)
                outfile.write(combine)
                outfile.write("\n")
     finally:
            file.close()
            outfile.close()

有人有想法么?提前非常感谢。

4

2 回答 2

3

您的正则表达式以 结尾$,这表明它希望该行在该点结束。如果删除它,它应该可以正常工作:

regex = re.findall(r'(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})', text)

您还可以进一步简化正则表达式本身:

regex = re.findall(r'(?:\d{1,3}\.){3}\d{1,3}', text)
于 2013-02-28T09:13:36.777 回答
1

这就是我认为正在发生的事情。您有一个查找乱码并用空格替换它们的模式。当您有一个 IP 地址后只剩下垃圾时,垃圾会变成空格,然后当您剥离字符串时,空格就消失了,只剩下您想要匹配的地址。

您的模式以 a 结尾,$因此它锚定到行尾,因此当地址是行中的最后一件事时,它匹配。

当您有this is a test非垃圾字符时,strip 不会删除它们,则$意味着 IP 地址不匹配。

于 2013-02-28T09:15:20.730 回答