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

如何分割包含不等数量空格的日志字符串并提取指定字段

不等空格分隔日志字段的解决方案

Shell 命令行快速处理

awk 默认将连续任意长度的空白字符作为分隔符,无需额外处理空格数量差异,可直接提取对应字段:

# 直接输出处理后的三列内容,$1为进程名,$2-$5拼接为执行日期,末尾括号内容为运行时长
awk '{print $1, $2" "$3" "$4" "$5, substr($0, index($0, "("))}' your_log.log

如果需要格式化输出为CSV等结构化格式,可调整为:

awk -v OFS=',' '{print $1, $2" "$3" "$4" "$5, substr($0, index($0, "("))}' your_log.log > processed_log.csv

Python 脚本处理

两种实现方式可按需选择:

  • 按连续空白分割实现,逻辑简单易维护
import re

with open("your_log.log", "r", encoding="utf-8") as f:
    for line in f:
        line = line.strip()
        if not line:
            continue
        # 按1个及以上的空白字符分割
        parts = re.split(r"\s+", line)
        process_name = parts[0]
        exec_date = f"{parts[1]} {parts[2]} {parts[3]} {parts[4]}"
        run_duration = parts[-1]
        # 后续可自行处理三个字段的存储逻辑
  • 正则捕获组实现,容错性更高,日志格式有小变动也能正常匹配
import re

# 预编译正则,三个捕获组分别对应进程名、执行日期、运行时长
pattern = re.compile(r"^(\w+)\s+([A-Za-z]{3}\s[A-Za-z]{3}\s+\d{1,2}\s\d{2}:\d{2})\s+.*?(\(\d{2}:\d{2}\))\s*$")

with open("your_log.log", "r", encoding="utf-8") as f:
    for line in f:
        match_res = pattern.match(line)
        if match_res:
            process_name, exec_date, run_duration = match_res.groups()
            # 后续字段处理逻辑

通用跨语言实现思路

如果使用其他语言处理,可套用以下通用逻辑:

  • 先去除每行首尾的空白字符
  • 把字符串中连续多个空白字符统一替换为单个空格
  • 再按单个空格对字符串做切分,取对应位置的字段拼接即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 18:06:05