linux过滤系统日志应按来源选择工具:systemd日志用journalctl支持自然语言时间筛选;传统文本日志需用grep、awk等解析不统一的时间戳格式。

Linux 中过滤特定时间段的系统日志,关键看日志来源:systemd 管理的日志用 journalctl 最直接;传统文本日志(如 /var/log/messages)则需配合 grep、awk 解析时间戳。
用 journalctl 查 systemd 日志(推荐首选)
systemd 日志自带结构化时间戳,journalctl 原生支持自然语言时间表达式,无需手动解析。
- 查最近 20 分钟:
journalctl --since "20 minutes ago" - 查今天凌晨到上午 10 点:
journalctl --since "today" --until "today 10:00" - 查精确区间(含秒):
journalctl --since "2026-10-12 14:30:00" --until "2026-10-12 15:45:59" - 结合服务和级别:
journalctl -u sshd --since yesterday -p warning - 实时滚动查看某起点之后新增日志:
journalctl --since "2026-10-13 04:00" -f
处理 /var/log/ 下的文本日志(如 syslog、messages)
这类日志时间格式不统一,需先确认格式再匹配。常用做法是快速粗筛 + 精确范围控制。
- 先看前三行定格式:
head -n 3 /var/log/syslog(常见有Oct 13 05:22:01或2026-10-13T05:22:01) - 按旧式格式(月+日+时)粗筛:
grep "Oct 13 05:[3-5][0-9]" /var/log/syslog - 按 ISO 格式(年-月-日 时:分)用 awk 比较:
awk '$1" "$2 >= "2026-10-13 05:00:00" && $1" "$2 (要求前两列是日期和时间) - 跨多天或格式混乱时,转时间戳再算:
awk '{cmd="date -d \""$1" "$2"\" +%s 2>/dev/null"; cmd | getline ts; close(cmd); if (ts >= 1728767400 && ts (其中两个数字是 <code>date -d "2026-10-13 05:10" +%s得到的秒数)
组合技巧提升效率
大日志文件别硬扫,先缩小范围再精筛。
- 用
grep -E "Oct 13 05:"快速提取当天上午日志,再 pipe 给 awk 做分钟级过滤 - 想只看错误且限定时间?
journalctl -p err --since "2 hours ago"或grep -i "error\|fail" /var/log/messages | grep "Oct 13 05:" - 实时监控某段时间起的新日志:
tail -f /var/log/secure | awk -v start=$(date -d "5 minutes ago" +%s) '{cmd="date -d \""$1" "$2"\" +%s 2>/dev/null"; cmd | getline ts; close(cmd); if (ts >= start) print}'
小提醒:注意日志类型和权限
journalctl 默认只对 root 或 adm 组用户开放完整日志;普通用户可能需加 --user 查自身服务日志。文本日志一般需读取权限,必要时加 sudo。











