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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 13:06:03