Python解析日志提取COMMAND字段命令的脚本实现问题
Python日志命令提取脚本修复方案
需求说明
编写Python脚本实现以下功能:
- 运行后通过标准输入(stdin)接收用户粘贴的日志内容
- 解析日志中记录的所有执行命令,逐行提取无多余空格的命令本体(不含命令后附带的参数)
- 解析完成后将结果输出到标准输出(stdout)
已知问题
原有实现存在三个异常:
- 提取逻辑会将命令后的参数一并返回,无法单独拿到命令本体
- 字符串分割方案仅能提取到第一条匹配的命令,多行日志会漏匹配
- 自行编写的正则规则无法正确提取关键字
COMMAND=后的目标字符串
测试样本
日志单行示例
Jun 16 10:54:27 debian-srv sudo: linuxusr: TTY=pts/20 ; PWD=/home/linuxusr ; USER=root ; COMMAND=/usr/bin/tail /var/log/auth.log
上述日志行的正确提取结果应为/usr/bin/tail,不含后续参数/var/log/auth.log。
原有问题代码
def main(): auth_log_content = '' commands = [] inp = input('auth log content: ') while inp != '': pattern = 'COMMAND=' if pattern in inp: commands.append(inp.split(pattern)[-1].strip()) inp = input('auth log content: ') print('==============FOUND COMMANDS==============') print('\n'.join(commands)) main()
修复实现
问题根因
- 原代码直接截取
COMMAND=后的全部字符串,没有做命令与参数的边界分割,因此会携带后续参数 - 输入终止逻辑依赖空行判断,未处理标准输入EOF场景,多数用户粘贴完成后通过快捷键结束输入时会触发逻辑异常,导致仅能读取首行内容
- 正则编写时未正确设置边界匹配规则,导致匹配结果偏移或为空
可直接运行的修复后代码
import re import sys def main(): commands = [] # 匹配COMMAND=后连续非空白字符,即为不带参数的命令本体 cmd_match_rule = re.compile(r'COMMAND=(\S+)') print("请粘贴日志内容,粘贴完成后按Ctrl+D(Windows环境按Ctrl+Z后回车)结束输入:") # 逐行遍历标准输入,自动处理EOF终止场景 for line in sys.stdin: match_res = cmd_match_rule.search(line) if match_res: commands.append(match_res.group(1).strip()) print('==============FOUND COMMANDS==============') print('\n'.join(commands)) if __name__ == "__main__": main()
修复点说明
- 输入读取改用
sys.stdin逐行遍历,无需用户手动输入空行终止,兼容所有终端的粘贴输入场景,不会漏读多行日志 - 正则规则
r'COMMAND=(\S+)'直接锁定COMMAND=后到第一个空白字符前的内容,天然截断后续参数,无需额外字符串分割处理 - 移除冗余的字符串存在性判断,正则匹配直接返回提取结果,避免多轮分割导致的内容错位
内容的提问来源于stack exchange,提问作者n00bcoder
相关产品推荐
相关产品推荐

