You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()

修复实现

问题根因

  1. 原代码直接截取COMMAND=后的全部字符串,没有做命令与参数的边界分割,因此会携带后续参数
  2. 输入终止逻辑依赖空行判断,未处理标准输入EOF场景,多数用户粘贴完成后通过快捷键结束输入时会触发逻辑异常,导致仅能读取首行内容
  3. 正则编写时未正确设置边界匹配规则,导致匹配结果偏移或为空

可直接运行的修复后代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 04:15:50