如何用sed/awk或Python替换日志指定内容并删除对应行
日志转换解决方案
AWK 命令
AWK 适合处理这种按组关联的文本行,以下命令可直接处理日志文件:
BEGIN { FS = ";"; OFS = ";" } /^$/ { print; next } /SVC;GX81CBCCONVCH10/ { svc = $0; next } /EXT;/ { gsub(/GX81CBCCONVCH10/, $8, svc) print svc next } /RTC;/ { next }
使用方式:
# 保存为脚本文件执行 awk -f script.awk input.log > output.log # 或直接单行执行 awk 'BEGIN { FS=";"; OFS=";" } /^$/ {print;next} /SVC;GX81CBCCONVCH10/ {svc=$0;next} /EXT;/ {gsub(/GX81CBCCONVCH10/,$8,svc);print svc;next} /RTC;/ {next}' input.log > output.log
说明:
- 以分号作为字段分隔符,缓存匹配到的SVC行
- 读取EXT行时,提取第8个字段(GX开头的目标字符串),替换SVC行中的旧字符串后输出
- 跳过RTC行,保留原有的空行分隔
Sed 命令
Sed 需要启用多行模式处理连续三行,以下命令兼容GNU Sed:
:loop /SVC;GX81CBCCONVCH10/{ N /EXT;/!b loop N s/\(.*\)GX81CBCCONVCH10\(.*\n\).*EXT;.*;.*;.*;\(GX[^;]*\).*\n.*RTC.*/\1\3\2/ } /RTC;/d /EXT;/d
使用方式:
# 保存为脚本文件执行 sed -E -f script.sed input.log > output.log # 或直接单行执行 sed -E ':loop; /SVC;GX81CBCCONVCH10/{N; /EXT;/!b loop; N; s/\(.*\)GX81CBCCONVCH10\(.*\n\).*EXT;.*;.*;.*;\(GX[^;]*\).*\n.*RTC.*/\1\3\2/}; /RTC;/d; /EXT;/d' input.log > output.log
说明:
- 循环读取行直到捕获到SVC+EXT+RTC的完整组
- 用正则提取EXT行中的GX开头字符串,替换SVC行的目标内容
- 最后删除所有EXT和RTC行,保留处理后的SVC行和空行
Python 脚本
如果需要更灵活的逻辑,Python脚本适合扩展:
with open("input.log", "r") as infile, open("output.log", "w") as outfile: lines = infile.read().splitlines() i = 0 while i < len(lines): line = lines[i].strip() if not line: outfile.write("\n") i += 1 continue # 处理目标SVC行 if "SVC;GX81CBCCONVCH10" in line: svc_line = line # 读取后续EXT行提取替换字符串 ext_line = lines[i+1] gx_str = ext_line.split(";")[7] # 完成替换并输出 new_svc = svc_line.replace("GX81CBCCONVCH10", gx_str) outfile.write(new_svc + "\n") # 跳过EXT和RTC行 i += 3 else: # 处理其他行(若存在) outfile.write(line + "\n") i += 1
使用方式:保存为convert_log.py,执行python convert_log.py,将生成output.log
说明:
- 按行读取日志,识别并保留空行
- 遇到目标SVC行时,读取后续EXT行提取替换字符串,完成替换后输出
- 跳过对应的EXT和RTC行,确保只保留处理后的SVC行和分隔空行
内容的提问来源于stack exchange,提问作者Subharthee Dutta
相关产品推荐
相关产品推荐

