Python 使用通配符选项搜索日志

Python search logs using wildcard options

我有一个非常大的 netflow 数据集,看起来像这样:

192.168.1.3  www.123.com
192.168.1.6  api.123.com
192.168.1.3  blah.123.com
192.168.1.3  www.google.com
192.168.1.6  www.xyz.com
192.168.1.6  test.xyz.com
192.168.1.3  3.xyz.co.uk
192.168.1.3  www.blahxyzblah.com
....

我还有一个小得多的通配域数据集,如下所示:

*.xyz.com
api.123.com
...

我希望能够使用 python 搜索我的数据集并找到所有匹配项。所以在上面的例子中,我会匹配:

192.168.1.6  www.xyz.com
192.168.1.6  test.xyz.com
192.168.1.6  api.123.com

我尝试使用 re 模块,但无法匹配任何内容。

for f in offendingsites:
    for l in logs:
        if re.search(f,l):
            print(l)

您的违规网站不是正则表达式,它们是 shell 通配符。但是,您可以使用 fnmatch.translate 将它们转换为正则表达式:

for f in offendingsites:
    r = fnmatch.translate(f)
    for l in logs:
        if re.search(r, l):
            print(l)

您也可以使用 fnmatch.fnmatch() 进行通配符模式搜索。

演示:

from fnmatch import fnmatch

with open("wildcards.txt") as offendingsites, open("dataset.txt") as logs:
    for f in offendingsites:
        for l in logs:
            f, l = f.strip(), l.strip() # Remove whitespace
            if fnmatch(l, f):
                print(l)

输出:

192.168.1.6  www.xyz.com
192.168.1.6  test.xyz.com