【问题标题】:Read an Nginx log file and get the IPs读取 Nginx 日志文件并获取 IP
【发布时间】:2021-03-25 06:02:24
【问题描述】:

我正在制作一个程序,我需要读取一个包含 IP 的 Nginx 日志文件。该文件如下所示:

127.0.0.1 - - [17/Nov/2020:19:19:55 +0100] "GET / HTTP/1.1" 200 396 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0"
127.0.0.1 - - [17/Nov/2020:19:19:50 +0100] "GET / HTTP/1.1" 200 396 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0"
127.0.0.1 - - [17/Nov/2020:19:19:45 +0100] "GET / HTTP/1.1" 200 396 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0"

正如我所说,我只需要第一部分,即 IP,并将其保存到一个新的 .txt 文件中。目前我有以下代码可以阅读,但我无法仅获取 IP:

with open('/var/log/nginx/access.log', 'r') as f:
    ip_list = f.readlines()

此代码返回此列表:

['127.0.0.1 - - [17/Nov/2020:19:19:55 +0100] "GET / HTTP/1.1" 200 396 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0"\n', '\n', 
'127.0.0.1 - - [17/Nov/2020:19:19:50 +0100] "GET / HTTP/1.1" 200 396 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0"\n', '\n', 
'127.0.0.1 - - [17/Nov/2020:19:19:45 +0100] "GET / HTTP/1.1" 200 396 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0"\n', '\n']

现在我只需要获取 IP 并用它们创建一个新文件。

【问题讨论】:

    标签: python python-3.x list nginx


    【解决方案1】:

    您可以使用正则表达式从日志文件中查找所有 IPv4 IP。

    import re
    
    # Loading the contents of the log file
    f = open('/var/log/nginx/access.log', 'r')
    text_to_search = f.read()
    f.close()
    
    
    # Regex for IPv4
    ip_pattern = re.compile("\d\d?\d?\.\d\d?\d?\.\d\d?\d?\.\d\d?\d?")
    
    # Finding all the IPs
    results = ip_pattern.findall(text_to_search)
    
    # Loop to print all the IPv4 addresses
    for result in results:
        print(result)
    
    

    【讨论】:

      【解决方案2】:

      需要python吗?你可以这样做:

      cat /var/log/nginx/access.log | awk '{print $1}' > txt_file.txt
      

      【讨论】:

        【解决方案3】:

        您可以通过-- 拆分字符串行并捕获第一个元素以获取 IP,最后仅将每行上的那些 IP 写入新日志文件。

        with open('/var/log/nginx/access.log', 'r') as f:
            log_line = f.readlines()
        
        ip_list = [ line.split('- -')[0].strip() for line in log_line]
        print(ip_list)
        with open('/var/log/nginx/access_ips.log', 'w') as f:
            f.write('\n'.join(ip_list))
        

        注意您可以使用正则表达式模式匹配来仅获取 IP 或任何其他方式,因为它可以通过多种方式完成。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-11-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多