【Linux 运维】告别 cat:如何按“时间段”优雅地截取日志文件?

前言

做后端开发或运维的同学,一定都经历过这样的场景:

线上服务出了 Bug,老板让你查一下今天上午 10:00 到 11:00 到底发生了什么。你登录服务器一看,app.log 已经跑到了 10GB

这时候如果你直接 vim 打开,服务器可能会卡死;如果你用 cattail 慢慢翻,眼睛都要看瞎。

其实,在 CentOS(以及绝大多数 Linux 发行版)下,我们完全不需要写复杂的脚本,只需要一行命令,就能把指定时间段 的日志另存为一个新的文件。

今天就分享三种最常用的姿势,由浅入深,总有一款适合你。


准备工作

假设我们的日志文件名为 app.log,格式如下(标准的日期开头):

Plaintext

复制代码
2023-10-27 10:00:01 [INFO] User login success
2023-10-27 10:00:05 [WARN] Database query slow
...

我们的目标是:将 10:00 到 11:00 的日志,另存为 bug_report.log


姿势一:sed ------ 简单粗暴(推荐日志连续的情况)

sed 是流编辑器,它非常适合处理这种"从 A 开始,到 B 结束"的任务。

命令模板:

Bash

复制代码
sed -n '/开始时间/,/结束时间/p' 原日志 > 新日志

实战操作:

Bash

复制代码
sed -n '/2023-10-27 10:00:00/,/2023-10-27 11:00:00/p' app.log > bug_report.log

✅ 优点:

  • 命令简单,好记。

  • 处理速度极快。

⚠️ 缺点(非常重要):

sed 是完全匹配字符串。如果你的日志里正好没有 10:00:00 这一秒的记录(比如那一秒没人访问),sed 就会找不到开始标记,导致截取失败。


姿势二:awk ------ 精准打击(最稳健的方案)

如果你担心日志中间有断档(比如某一秒没有日志),awk 是最佳选择。它不看字符串是否相等,而是把时间当做字符进行比较(大于/小于)

只要日志行首是时间,它就能精确捕捉范围。

命令模板:

Bash

复制代码
awk '$0 >= "开始时间" && $0 <= "结束时间"' 原日志 > 新日志

(注:$0 代表整行内容,如果只需要比较第2列时间,可以用 $2)

实战操作:

Bash

复制代码
awk '$0 >= "2023-10-27 10:00:00" && $0 <= "2023-10-27 11:00:00"' app.log > bug_report.log

✅ 优点:

  • 容错率高:即使日志里没有 10:00:00 这一行,它也会从 10:00:01 开始截取。

  • 逻辑清晰,支持复杂的过滤条件。


姿势三:grep ------ 模糊搜索(适合"按小时"抓取)

如果你不需要精确到秒,只是想把"10 点这一小时"的所有日志都拉出来看看,grep 是最快的。

命令模板:

Bash

复制代码
grep "^时间前缀" 原日志 > 新日志

实战操作(抓取 10 点段所有日志):

Bash

复制代码
grep "^2023-10-27 10:" app.log > 10_am_logs.log

✅ 优点:

  • 几乎没有心智负担,最常用的命令。

  • 适合快速排查故障范围。


总结与建议

方案 命令关键字 适用场景 稳健性
方案一 sed 确定起始时间点一定存在时 ⭐⭐⭐
方案二 awk 生产环境首选,时间点可能不连续 ⭐⭐⭐⭐⭐
方案三 grep 只需要按小时/按分钟模糊查询 ⭐⭐⭐⭐

老司机建议:

如果你在写自动化脚本来备份日志,请务必使用 方案二 (awk),因为它不会因为某一秒日志的缺失而导致脚本失效。


希望这篇小技巧能帮你从海量日志中从容脱身!

相关推荐
wanhengidc3 小时前
云手机 高振畅玩不踩坑
运维·服务器·安全·web安全·智能手机
有谁看见我的剑了?3 小时前
linux 添加硬盘后系统识别不到硬盘处理
linux·运维·服务器
JoyCong19983 小时前
ToDesk远程屏幕墙技术白皮书:如何重塑全局运维视界
运维·电脑·远程工作
偶尔上线经常挺尸4 小时前
《100个“反常识”经验15:Nginx 502排查:从应用到内核》
运维·nginx·性能调优·反向代理·502错误·http排错
yc_12244 小时前
用 Visual Studio 远程调试 Linux:从零到流畅的完整指南
linux·ide·visual studio
思茂信息4 小时前
CST软件如何进行参数化扫描?
运维·开发语言·javascript·windows·ecmascript·软件工程·软件需求
计算机安禾5 小时前
【Linux从入门到精通】第31篇:防火墙漫谈——iptables与firewalld防护指南
linux·运维·php
下一页盛夏花开5 小时前
ubuntu 20中安装QT以后出现红色空心断点
linux·运维·ubuntu
金色光环5 小时前
FreeModbus释放底层的 TCP 监听端口
服务器·网络·tcp/ip
sanshanjianke5 小时前
Thunderobot 911ME 笔记本 Linux 风扇控制研究
linux