
日志查询四大剑客 实战补强head / tail / less / more 一篇吃透生产环境的日志动辄几十 G一个cat就能让你的 SSH 终端自闭。这篇文章帮你把 Linux 看日志的正确姿势捋清楚并补上原资料没讲到的压缩日志、journalctl、grep 联动、awk 切片等实战玩法。关键词head · tail · less · more · journalctl · zless · grep · 实时跟踪一、先说结论为什么不要用 cat / vim 看日志很多新手第一次排查问题时下意识就敲cat /var/log/app/server.log vim /var/log/nginx/access.log——然后终端开始疯狂滚屏或者整台机器内存飙红。原因很简单命令行为大文件后果cat把整个文件一次性写到 stdout刷屏停不下来CtrlC 都救不回光标vi/vim把整个文件从磁盘全部加载进内存30G 日志直接 OOM机器卡死nano同上且更卡不推荐✅正确做法用按行/按页流式读取的工具不占内存head / tail / less / more —— 日志查询四剑客二、head看文件开头2.1 用法head [选项] 文件选项含义-n NUM显示前 NUM 行默认 10 行-c NUM显示前 NUM 字节-q多文件时不打印文件名头-v始终打印文件名头2.2 案例显示前 5 行# 三种写法等价 head -n5 /etc/passwd head -n 5 /etc/passwd head -5 /etc/passwd温馨提示日常-数字最快某些精简系统busybox / Alpine只支持-n NUM遇到报错改回-n5即可。2.3 看前 1KB 内容head -c 1024 /var/log/app/server.log三、tail看文件结尾运维出场率最高3.1 用法选项含义-n NUM显示最后 NUM 行默认 10 行-ffollow持续输出新写入的内容看日志神器-Ffollow 文件被 rotate 后自动重新打开强烈推荐--pidPID当指定进程退出后自动结束 tail-c NUM最后 NUM 字节3.2 案例显示后 5 行tail -n5 /etc/passwd tail -5 /etc/passwd3.3 案例实时跟踪日志# 经典写法 tail -f /var/log/secure # 推荐写法应对 logrotate tail -F /var/log/nginx/access.log实测建议打开两个终端一个跑tail -F另一个触发动作登录、发请求等就能直观看到日志滚动。3.4 赠送命令tailf /var/log/messages # 等价于 tail -f但已被多数发行版废弃建议直接用 tail -F3.5 补充进阶组合拳# 看最后 1000 行里包含 ERROR 的 tail -n 1000 server.log | grep -i error # 实时跟踪并高亮关键字 tail -F app.log | grep--coloralways -E ERROR|WARN|$ # 实时只看 5xx 响应 tail -F /var/log/nginx/access.log | grep 5[0-9]{2} # 跟踪到进程结束自动退出 tail --pid$(pgrep -f myapp) -F app.log四、less分页浏览的王者less比more更强大俗话less is more, more than more。它不预读整个文件所以哪怕 100G 也能秒开。4.1 常用快捷键快捷键作用q退出空格/f下一页forwardb上一页back↓/↑单行滚动g跳到第 1 行G跳到最后 1 行99g跳到第 99 行/关键字向下搜索n下一个N上一个?关键字向上搜索关键字只显示匹配行超好用F类似tail -f按 CtrlC 退出跟踪h帮助4.2 常用选项less -N file # 显示行号 less -S file # 长行不换行看 JSON / 一行很长的日志特别有用 less -i file # 搜索时忽略大小写 less F file # 启动即进入 tail -f 模式 less G file # 直接跳到末尾4.3 实战小技巧# 边读压缩文件边分页不用先解压 zless /var/log/app/server.log.2024-06-01.gz xzless server.log.xz bzless server.log.bz2 # 看 systemd 日志带分页 journalctl -u nginx | less五、more分页浏览的老前辈more file按空格翻页按回车翻一行到达文件末尾会自动退出不能往回翻没有less的搜索、行号、跟踪等功能⚠️ 现代 Linux 一律推荐lessmore只在最小化镜像或老旧 UNIX 里用。六、四剑客对比速查命令适用场景是否可向上翻是否实时跟踪是否支持搜索head看文件开头—❌❌tail看文件结尾 / 实时跟踪—✅-f/-F❌配合 grepless分页浏览大文件✅✅F模式✅/?more简单分页浏览❌❌有限口诀“头 head尾 tail长文翻看用 lessmore 只是备胎”。七、补充生产必备的几把暗器7.1 grep / egrep / rg —— 关键字过滤grep -i error app.log # 忽略大小写 grep -n timeout app.log # 显示行号 grep -c ERROR app.log # 统计出现次数 grep -v DEBUG app.log # 反向匹配排除 DEBUG grep -A3 -B1 Exception app.log # 命中行前 1 后 3 行上下文 grep -r panic /var/log/ # 递归整个目录 grep-E ERROR|FATAL app.log # 扩展正则或性能更猛的替代品推荐安装rg OutOfMemory /var/log/ # ripgrep比 grep 快几倍自动跳过二进制 ug pattern file # ugrep支持模糊匹配7.2 awk —— 按列提取与统计# 统计每个 IP 的访问次数 Top 10access.log 标准格式 awk {print $1} access.log | sort | uniq -c | sort -rn | head -10 # 统计每个 HTTP 状态码出现次数 awk {print $9} access.log | sort | uniq -c | sort -rn # 计算某接口平均响应时间假设第 11 列是耗时 ms awk $7/api/order{sum$11; n} END{print sum/n ms} access.log sort:对第一行输入的ip进行排序 uniq:统计重复项 sort -rn按照前面统计出的访问次数从高到低重新排序。实例如下 1. 先创建测试日志 access.log 执行命令生成测试内容 bash 运行 cat access.log EOF 192.168.1.10 - - [24/Jun/2026:10:00:00] GET /index.html 200 192.168.1.20 - - [24/Jun/2026:10:00:01] GET /api 200 192.168.1.10 - - [24/Jun/2026:10:00:02] GET /index.html 200 192.168.1.30 - - [24/Jun/2026:10:00:03] GET /test 200 192.168.1.10 - - [24/Jun/2026:10:00:04] GET /index.html 200 192.168.1.20 - - [24/Jun/2026:10:00:05] GET /api 200 192.168.1.10 - - [24/Jun/2026:10:00:06] GET /index.html 200 192.168.1.30 - - [24/Jun/2026:10:00:07] GET /test 200 192.168.1.30 - - [24/Jun/2026:10:00:08] GET /test 200 192.168.1.30 - - [24/Jun/2026:10:00:09] GET /test 200 EOF 2. 分步拆解演示 第一步awk {print $1} access.log 提取每行第一列IP bash 运行 awk {print $1} access.log 输出 plaintext 192.168.1.10 192.168.1.20 192.168.1.10 192.168.1.30 192.168.1.10 192.168.1.20 192.168.1.10 192.168.1.30 192.168.1.30 192.168.1.30 第二步加管道 | sort 按字符排序把相同 IP 凑到一起 bash 运行 awk {print $1} access.log | sort 输出 plaintext 192.168.1.10 192.168.1.10 192.168.1.10 192.168.1.10 192.168.1.20 192.168.1.20 192.168.1.30 192.168.1.30 192.168.1.30 192.168.1.30 第三步再加 | uniq -c 统计相邻重复行的次数格式次数 IP bash 运行 awk {print $1} access.log | sort | uniq -c 输出 plaintext 4 192.168.1.10 2 192.168.1.20 4 192.168.1.30 第四步再加 | sort -rn 按数字大小倒序排序访问次数从高到低 bash 运行 awk {print $1} access.log | sort | uniq -c | sort -rn 输出 plaintext 4 192.168.1.30 4 192.168.1.10 2 192.168.1.20 第五步最后 | head -10 取前 10 行本例只有 3 行全部展示 bash 运行 awk {print $1} access.log | sort | uniq -c | sort -rn | head -10 最终结果 plaintext 4 192.168.1.30 4 192.168.1.10 2 192.168.1.20 总结 192.168.1.10、192.168.1.30 各访问 4 次频次最高 192.168.1.20 访问 2 次 完全实现了「统计访问 IP 频次并取 TOP10」的需求。7.3 sed —— 流式编辑 / 提取sed -n 100,200p app.log # 只看第 100–200 行 sed -n /START/,/END/p app.log # 提取两个标记之间的内容 sed -i s/旧词/新词/g file # 批量替换生产慎用先备份7.4 journalctl —— systemd 时代的全局日志现在大多数发行版RHEL 7/Ubuntu 16.04的服务日志默认走systemd-journald不再单独写文件得用journalctljournalctl # 全部日志 journalctl -u nginx.service # 只看 nginx 单元 journalctl -u nginx -f # 实时跟踪相当于 tail -f journalctl --since 2026-06-12 09:00--until 2026-06-12 10:00 journalctl -p err # 只看 error 及以上级别 journalctl -k # 内核日志dmesg 的升级版 journalctl --disk-usage # 看 journal 占用多大磁盘 journalctl --vacuum-time7d # 只保留最近 7 天7.5 压缩日志 —— z 系列家族logrotate滚动后的日志通常是.gz/.xz/.bz2别先解压直接用原命令压缩版catzcat/xzcat/bzcatlesszless/xzless/bzlessgrepzgrep/xzgrep/bzgrepdiffzdiffzgrep -i oom /var/log/messages-*.gz7.6 多文件 / 多机日志聚合# 同时跟踪多个文件 tail -F /var/log /nginx/{access,error}.log # 多机日志聚合推荐工具 # - ELK / EFKElasticsearch Logstash/Fluentd Kibana # - Loki Grafana轻量、便宜、对 K8s 友好 # - ClickHouse Vector海量日志高性能分析八、避坑清单生产建议❌不要cat huge.log✅ 改用less或tail -n 500❌不要vim huge.log✅ 用view huge.log只读但同样会全量加载仍不推荐或less⚠️谨慎grep -r在/可能扫到/proc、/sys加--exclude-dir✅ 实时跟踪一律用tail -F不用tail -f防止 logrotate 后丢日志✅ 给日志配logrotate并设置compress、maxage免得撑爆磁盘✅ 重要服务接入集中式日志Loki / ELK别只靠登机grep✅ 排查问题先df -h /var/log看磁盘再du -sh *找最大日志✅ 涉及敏感字段手机号、身份证、token做脱敏后再外发九、示例脱敏说明文中所有日志路径、IP、用户名均为通用示例与任何真实生产系统无关。字段类型示例脱敏写法IP 地址192.0.2.x/198.51.100.xRFC 5737 文档示例段手机号138****0000邮箱userexample.com用户名user001/admin_demo路径/var/log/app/xxx.log公开排障截图前记得用sed/awk批量替换敏感字段例如sed -E s/1[3-9][0-9]{9}/138****0000/g; s/([0-9]{1,3}\.){3}[0-9]{1,3}/192.0.2.x/g raw.log safe.log十、一句话总结看日志不刷屏、不爆内存head 看头、tail 追尾、less 翻页、grep/awk 上场。系统日志走 journalctl压缩日志加个 z 前缀集中分析交给 Loki / ELK。如果对你有帮助欢迎点赞 / 在看 / 转发给身边正在被日志虐的运维同行********linux · 目录上一篇Vim 编辑器从入门到上瘾一篇文章搞定 Linux 程序员的瑞士军刀下一篇打包压缩三剑客 现代补强tar / gzip / zip 一篇全掌握含 zstd / pigz / 7z 实战阅读 10留言写留言