如何使用Shell脚本批量修改大体积日志文件指定字段内容
超大日志批量修改Shell脚本
针对GB级超大日志文件的批量修改需求,选用awk实现流式逐行处理,全程不会将整个文件加载到内存,处理性能和稳定性远高于普通sed逐行替换方案,完全适配超大文件场景。
可配置项说明
脚本内置3个可自定义参数,可根据实际业务需求直接修改:
EXECID_PREFIX:ExecID属性需要新增的前缀,本次样例取值为CANCEL_OLD_ROUTE_SUFFIX:日志末尾需要被替换的原路由后缀,本次样例取值为PACM001NEW_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
相关产品推荐
相关产品推荐

