先定窗再精读
面对几万行的日志,逐条翻找既慢又容易漏。做法是先确定一个锚点时间(比如告警触发时刻、某个可确认的攻击动作),用 sed 的地址范围把锚点前后若干分钟截成一个文件,再在片段里精读上下文。轮转后的压缩历史日志先解压或直接用 zcat 送进管道,不要在解压后的临时文件上反复操作。
基本信息
| 适用平台 | Linux/macOS 命令行,GNU sed 与 BSD sed 均可 |
|---|---|
| 核心语法 | sed -n '/起点/,/终点/p' 日志文件 |
| 窗口宽度 | 锚点前后各留 5 到 30 分钟,按事件密度调整 |
| 压缩日志 | zcat file.gz | sed -n ... 或 zgrep 先筛选 |
| 输出建议 | 重定向到单独文件,作为后续分析的输入 |
典型使用场景
- 已知一次成功登录时刻,截取前后半小时看是否有提权与外联动作
- 告警只给了域名,先按时间窗截取再看同一时段的其他事件
- 跨天排查:把当天日志截成上午、下午、夜间三段分别分析
- 多人协作:把窗口文件分给不同人精读,避免所有人翻同一份大日志
- 报告取证:窗口文件作为附件,说明结论所依据的原始范围
窗口截取与统计
窗口截取与统计
# 用起止模式截取窗口,模式里带上完整日期避免匹配到其他天
sed -n '/2026-01-02 03:10:/,/2026-01-02 03:30:/p' /var/log/auth.log > /tmp/win-0320.txt
wc -l /tmp/win-0320.txt
# 压缩历史日志直接处理,不落地解压
zcat /var/log/auth.log.2.gz | sed -n '/2026-01-01 22:00:/,/2026-01-01 23:00:/p' > /tmp/win-0101.txt
# 窗口内只保留关键事件,便于精读
grep -E 'Accepted|Failed|sudo|COMMAND=' /tmp/win-0320.txt常见时间格式与匹配写法
| 日志格式 | 样例片段 | 匹配注意 |
|---|---|---|
| ISO 日期 | 2026-01-02 03:20:11 | 带上秒或分钟前缀,避免同分钟跨天混淆 |
| syslog 无年份 | Jan 2 03:20:11 | 跨年要按文件与轮转顺序确定年份 |
| Apache 日志 | 02/Jan/2026:03:20:11 +0800 | 分隔符是斜杠与方括号,模式要照抄 |
| 带时区 ISO | 2026-01-02T03:20:11Z | 先确认是否 UTC,再与其他源对齐 |
sed 的地址范围按「首次匹配起点到其后的首次匹配终点」工作,同一窗口重复出现时只会截取第一段;日志被切割或时间回绕时要分次截取。
如果锚点只有来源 IP 没有时间,先用 grep 定位该 IP 的所有行,取首尾时间作为窗口边界,再回到全量日志截取。