python - 读取 Nginx 日志文件并获取 IP
问题描述
我正在制作一个程序,我需要读取一个包含 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 并用它们创建一个新文件。
解决方案
您可以拆分字符串行--
并捕获第一个元素以获取 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 或任何其他方式,因为它可以通过多种方式完成。
推荐阅读
- vue.js - Vue模块不自动应用CSS
- php - PHP 通知自定义格式
- mongodb - 为什么散列分片键会在 mongodb 中的每个分片上创建块
- angular - 使用 Angular 进行分页过滤
- .net - 调试本地存储的自己的 NuGet 包
- javascript - 使用 Javascript 从 Excel 文件中提取某些数据行
- http - Angular 7 中的 Http 帖子返回无效响应
- python - 根据字典中的值更新熊猫数据框
- ubuntu - Ubuntu 在 18.04 中限制运行 curl 命令
- typescript - 打字稿:如何根据对象键/值类型在 ES6 映射中创建条目