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

如何使用Shell脚本批量修改大体积日志文件指定字段内容

超大日志批量修改Shell脚本

针对GB级超大日志文件的批量修改需求,选用awk实现流式逐行处理,全程不会将整个文件加载到内存,处理性能和稳定性远高于普通sed逐行替换方案,完全适配超大文件场景。


可配置项说明

脚本内置3个可自定义参数,可根据实际业务需求直接修改:

  • EXECID_PREFIX:ExecID属性需要新增的前缀,本次样例取值为CANCEL_
  • OLD_ROUTE_SUFFIX:日志末尾需要被替换的原路由后缀,本次样例取值为PACM001
  • NEW_ROUTE_SUFFIX:替换后的新路由后缀,本次样例取值为SUBM001

完整脚本代码

#!/bin/bash
# 自定义配置区
EXECID_PREFIX="CANCEL_"
OLD_ROUTE_SUFFIX="PACM001"
NEW_ROUTE_SUFFIX="SUBM001"

# 入参校验
if [ $# -ne 2 ];then
    echo "使用方法: $0 原始日志路径 输出日志路径"
    exit 1
fi
if [ ! -f "$1" ];then
    echo "错误:指定的原始日志文件不存在"
    exit 1
fi

awk -v prefix="$EXECID_PREFIX" -v old_route="$OLD_ROUTE_SUFFIX" -v new_route="$NEW_ROUTE_SUFFIX" '
{
    # 捕获当前行原始ExecID属性值
    match($0, /ExecID="([^"]+)"/, execid_res)
    origin_execid = execid_res[1]
    
    # 给ExecID值添加指定前缀
    gsub(/ExecID="[^"]+"/, "ExecID=\"" prefix origin_execid "\"")
    
    # 将ExecType属性值从F改为H
    gsub(/ExecType="F"/, "ExecType=\"H\"")
    
    # 在pb_version属性前插入ExecRefID属性,值为原始ExecID
    gsub(/pb_version=/, "ExecRefID=\"" origin_execid "\" pb_version=")
    
    # 替换行尾路由标识
    gsub(old_route "$", new_route)
    
    # 输出处理完成的行
    print $0
}
' "$1" > "$2"

逻辑对应修改规则

脚本处理逻辑完全匹配需求规则:

  • 自动提取每行原始日志中ExecID的属性值暂存,新增ExecRefID属性时直接复用该原始值,不会出现取值错误
  • 精准匹配ExecID属性位置,为原值拼接配置好的指定前缀,不会误改其他字段
  • 精准匹配ExecType="F"的属性片段,将值替换为H,不会误改日志其他位置的F字符
  • ExecRefID属性固定插入在pb_version属性之前,和样例输出的属性顺序完全一致
  • 支持自定义路由旧值、新值,可按需调整日志末尾的路由标识

使用注意事项

  • 处理超大文件时禁止直接将输出重定向到原文件,会导致原文件内容被截断损坏,建议先输出到独立临时文件,校验内容无误后再替换原文件
  • 脚本采用awk流式逐行处理机制,内存占用始终维持在极低水平,和处理的文件大小无关,几十上百GB级别的日志也可以稳定运行
  • 正式处理全量日志前,建议先截取几十行样例日志做测试,确认输出格式、内容完全符合预期后再执行全量处理

内容的提问来源于stack exchange,提问作者A.Ranjan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 12:19:50