You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在命令行运行处理1TB日志文件的Python脚本?

解决你的日志解析与CSV写入问题

我看了你的代码,发现几个关键问题导致CSV没有写入,同时针对1TB的大日志文件,还有不少可以优化的地方,下面一步步帮你解决:

主要问题分析与修复

1. 命令行参数未被实际使用

你通过sys.argv[1]获取了输入文件路径,但代码里一直用的是硬编码的log_file变量,完全没用到ip_file!这就导致不管你命令行传什么文件,脚本始终读的是/Users/kiya/Desktop/mysql/ipscan/ip.txt,如果这个文件不是你实际要处理的日志,自然不会有输出。

2. 频繁打开输出文件

每次匹配到目标行就打开一次output_file,对于1TB的大文件来说,这会产生巨量的IO操作,不仅速度极慢,还可能因为文件频繁打开关闭导致写入异常。应该在一开始就打开输出文件,全程复用。

3. 正则匹配未处理失败情况

如果某行包含MBX_AUTHENTICATION_FAILED但没有匹配到用户名或IP,re.search会返回None,调用.group()就会抛出AttributeError,直接中断脚本运行。

4. 手动拼接CSV不规范

如果用户名里包含逗号,手动拼接的内容会破坏CSV格式,应该用你导入的csv.writer来处理。

5. 命令行提示拼写错误

提示里的pythone3是笔误,应该是python3


修正后的代码

import re
import sys
from csv import writer
import datetime

# 定义默认输出路径,也可以改成命令行参数传入
output_file = '/Users/kiya/Desktop/mysql/ipscan/output.csv'

try:
    # 用命令行传入的文件路径作为日志文件
    log_file = sys.argv[1]
except IndexError:
    print(f"usage: python3 {sys.argv[0]} [ip file]")
    sys.exit(1)

name_to_check = 'MBX_AUTHENTICATION_FAILED'

# 预编译正则表达式,提升大文件处理效率
username_pattern = re.compile(r'(?<=userName=)(.*?)(?=,)')
ip_pattern = re.compile(r'(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])')

# 一次性打开输出文件,全程复用
with open(output_file, 'w', newline='', encoding='utf-8') as outfile:
    csv_writer = writer(outfile)
    # 写入CSV表头(可选,根据需要添加)
    csv_writer.writerow(['username', 'ip'])
    
    # 逐行读取大文件,避免内存溢出
    with open(log_file, encoding="utf-8") as infile:
        for line_num, line in enumerate(infile, 1):
            if name_to_check not in line:
                continue
            
            # 处理用户名匹配
            username_match = username_pattern.search(line)
            if not username_match:
                print(f"Warning: Line {line_num} has no username, skipping")
                continue
            username = username_match.group().strip()
            
            # 处理IP匹配
            ip_match = ip_pattern.search(line)
            if not ip_match:
                print(f"Warning: Line {line_num} has no valid IP, skipping")
                continue
            ip = ip_match.group().strip()
            
            # 写入CSV行
            csv_writer.writerow([username, ip])

print(f"处理完成,结果已写入 {output_file}")

额外优化说明

  • 预编译正则:对于大文件,预编译正则表达式能显著提升匹配速度
  • 逐行读取:避免一次性加载1TB文件到内存,防止内存溢出
  • 错误处理:添加了匹配失败的警告,不会因为某一行有问题就中断整个脚本
  • CSV规范写入:用csv.writer自动处理特殊字符(比如逗号),保证CSV格式正确

如何运行脚本

在命令行进入脚本所在目录,然后执行:

python3 your_script_name.py /path/to/your/1TB_log_file.txt

替换your_script_name.py为你的脚本文件名,/path/to/your/1TB_log_file.txt为实际的日志文件路径。

内容的提问来源于stack exchange,提问作者Katarina Alves

火山引擎 最新活动