如何通过bash/shell实现目录下多行日志文件按日期合并排序
多行日志按日期合并排序Shell实现方案
适用场景:多个日志文件内的条目均以YYYY-MM-DD HH:MM:SS格式时间开头,支持包含跨行内容的日志,可直接集成到现有Shell脚本中。
核心实现代码
#!/bin/bash # 按实际情况修改日志目录、匹配规则和输出路径 LOG_DIR="./your_log_path" OUTPUT_FILE="./merged_sorted.log" # 合并排序主逻辑 awk ' # 匹配日期开头的行,作为新日志的起始 /^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}/ { if (prev != "") print prev; prev = $0 } # 非日期开头的行判定为上一条日志的跨行内容,用特殊分隔符拼接 !/^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}/ { prev = prev "\001" $0 } END { print prev } ' "$LOG_DIR"/*.log \ # 按前两列(日期+时间)升序排序 | sort -t ' ' -k1,2 \ # 替换特殊分隔符恢复原本的多行格式 | awk '{gsub(/\001/,"\n"); print}' > "$OUTPUT_FILE"
功能说明
- 支持带毫秒后缀的时间格式,排序时会自动按时间先后正确排列
- 保留日志原有的跨行结构、空行等格式
- 可处理任意数量的同格式日志文件
常用优化配置
- 如需清除日志中的Windows换行符
^M,可在第一步awk的首行添加{gsub(/\r/,"")}批量替换 - 如需对排序后日志去重,可将sort命令改为
sort -t ' ' -k1,2 -u,仅会删除完全相同的重复日志 - 处理GB级以上大体积日志时,可给sort添加
--parallel=4参数开启多线程排序,数字替换为实际可用的CPU核心数即可
针对你提供的日志样例,处理后输出结果如下:
2021-06-29 10:31:25.437839 PID29559 message Log2 example 2021-06-29 10:31:26 message Log1 example -line 1 Second line of message
内容的提问来源于stack exchange,提问作者yaron
相关产品推荐
相关产品推荐

