在Linux系统运维和开发调试中,查看日志是最基础也最高频的操作。无论是排查服务崩溃原因,还是观察接口调用情况,都离不开对日志文件的读取与分析。这里介绍三款最常用、几乎所有发行版都自带的原生命令:tail、head与grep,它们分别解决不同维度的日志查看需求。

一、使用tail命令查看日志末尾与实时内容
tail命令用于显示文件尾部的内容,默认输出最后10行。在线上问题排查时,我们往往只关心最近发生的异常,因此tail几乎是最先被用到的工具。它支持-f参数实时跟踪文件增长,对于监控正在运行的服务非常有用。
例如,查看系统认证日志的最后20行,可使用如下命令:
# 查看 /var/log/auth.log 最后20行 tail -n 20 /var/log/auth.log # 实时跟踪日志文件新增内容,Ctrl+C退出 tail -f /var/log/auth.log # 等价写法,某些发行版支持tailf tailf /var/log/auth.log
需要注意的是,当日志文件被轮转(logrotate)切割后,tail -f可能会继续监听已被重命名的旧文件。此时应使用-F参数,它会在文件被替换后自动重新打开新文件。另外,tail也支持从第N行开始显示,比如tail -n +100表示跳过前99行,输出从第100行到结尾的全部内容。
tail的实用组合场景
在容器或进程频繁写日志的环境里,单独tail可能刷屏太快。通常配合sleep或管道使用,例如只观察最近5秒内新增的报错。虽然tail本身不带时间过滤,但结合awk或grep即可实现轻量过滤,无需借助重型工具。
一个常见写法是:先用tail拿到最新100行,再用grep筛出错误级别,这样既控制输出量又聚焦问题。这种思路比直接cat大文件再grep更省资源,特别是在日志达到数GB时差异明显。
二、使用head命令查看日志开头与启动信息
head与tail相对,用于显示文件开头部分,默认也是10行。它适合查看程序启动初期的配置加载、初始化顺序等信息。很多服务只在启动阶段打印关键环境变量,后续不再输出,这时候head就比tail更直接。
以下示例展示如何提取日志头部并排除空行干扰:
# 查看日志前15行 head -n 15 /var/log/boot.log # 结合grep过滤掉含debug的行,只看前20行中的警告 head -n 20 /var/log/boot.log | grep -v debug
head在处理被截断的损坏日志时也比较安全,因为它不依赖文件末尾结构。不过head的局限性在于无法像tail -f那样动态跟踪,所以如果需观察启动后持续输出,仍需回到tail方案。
head与tail的互补用法
如果想看文件中间某段,可以组合两者:先用head取前M行,再用tail取其中后N行。例如head -n 500 file.log | tail -n 20就能显示第481到500行。这种写法比sed更直观,适合临时排障。
在自动化脚本里,head也常用来做健康检查,比如读取日志首行判断服务是否已完成启动,避免盲目等待。理解head的边界,能让你在错误使用tail导致遗漏启动异常时,有另一个可靠入口。
三、使用grep命令按关键词过滤日志
grep是文本搜索利器,能从任意日志中按模式匹配行。它不关心位置,只关心内容,因此常与tail或head通过管道组合。grep支持基础正则,也支持扩展正则(-E),足以应对多数过滤需求。
下面演示从系统日志中找出所有包含特定IP或错误词的记录:
# 在日志中查找含ERROR的行,并显示行号 grep -n ERROR /var/log/syslog # 实时跟踪日志并只输出含Timeout的行 tail -f /var/log/syslog | grep Timeout # 使用扩展正则匹配两种关键词之一 grep -E 'Failed|Denied' /var/log/auth.log
grep的-i参数可忽略大小写,-C 3可显示匹配行前后各3行上下文,对理解报错链路很有帮助。若日志量极大,可先用grep -m 100限制匹配数量,防止终端被淹没。注意grep默认使用基础正则,若写(a|b)这类语法需加-E,否则括号会被当作普通字符。
grep与其他命令的协作陷阱
当grep通过管道接收tail -f的输出时,由于管道缓冲,可能出现匹配行不能立即刷出的问题。这时可加--line-buffered强制逐行刷新。另外,若在脚本里用grep判断是否存在某错误并据此退出,应检查退出码:匹配到返回0,未匹配返回1,这一特性可直接用于if语句。
还有一种误区是认为grep能解析JSON或复杂格式日志,其实它只做行匹配。若日志为JSON单行,需配合jq等工具。明确grep的能力边界,才能避免写出既慢又不准的过滤命令。
四、三种命令的对比与选用建议
从功能定位看,tail重在对“时间最新”的观测,head重在对“过程起点”的观测,grep重在对“内容特征”的提取。三者并非互斥,实际排障通常是tail -f配合grep,或head配合grep。下表简要对比:
| 命令 | 主要视角 | 典型参数 | 适用阶段 |
|---|---|---|---|
| tail | 文件末尾/实时 | -n, -f, -F | 运行期监控 |
| head | 文件开头 | -n | 启动期检查 |
| grep | 内容匹配 | -n, -i, -E, -C | 全阶段过滤 |
建议新手在拿到一台陌生服务器时,先通过head看服务启动日志确认无致命错误,再用tail -f观察当前行为,遇到噪声则用grep收窄范围。这种渐进式思路比一次性cat整个日志更高效,也更容易形成可复用的排障习惯。
最后提醒,日志路径在不同发行版有差异,Debian系多在/var/log下以软件名命名,RHEL系则可能用rsyslog集中存储。使用上述命令前,可用ls /var/log确认目标文件,避免看错日志导致误判。