优化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
相关产品推荐
相关产品推荐

