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

优化Bash脚本:行首无日期时自动填充上一行日期前缀

原有脚本性能差的原因
  • 逐行循环时反复调用sed/grep/cut子进程,每处理一行就要至少读写2次文件,文件越大IO开销越高,时间复杂度为O(n²)
  • Shell原生循环处理文本效率极低,完全没有发挥流处理工具单遍扫描的性能优势
优化方案(awk单流处理,兼容MingW64)

用awk仅需扫描1次文件即可完成全部逻辑,无重复IO、无多余子进程调用,时间复杂度为O(n),处理GB级日志也能在秒级完成,完全匹配需求逻辑:

# 替换为你的实际日志文件路径
file="your_log_file.log"

awk '
/^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2},[0-9]{3}/ {
    last_date = $1 " " $2
    print
    next
}
{ print last_date " " $0 }
' "$file" > "$file.tmp" && mv "$file.tmp" "$file"
逻辑说明
  • 逐行匹配行首是否符合YYYY-MM-DD HH:MM:SS,mmm格式,匹配到时就把前两位的日期时间串缓存下来,直接输出原行
  • 未匹配到行首日期的行,直接把缓存的上一条有效日期拼在行首输出
  • 不会误判行中间出现的日期字符串,和给出的输入输出样例完全对齐
  • 采用临时文件替换原文件的写法,规避MingW64下部分版本awk/sed原地修改参数的兼容性问题

边界提示:如果日志第一行就缺失日期前缀,上述脚本会输出空前缀,若存在这种场景,可以在awk代码块开头加判断逻辑做异常处理即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 21:54:52