在Ubuntu服务器上排查问题时,我们经常需要快速了解一个文件的内容概况。比如一个几十万行的日志文件,用文本编辑器打开不仅慢,还可能拖垮终端。这时head和tail这对搭档就派上用场了:head从文件开头取内容,tail从文件末尾取内容,两个命令配合起来,基本能覆盖日常百分之八十的文件查看需求。

head命令的基本用法
head的作用是输出文件的开头部分,默认显示前10行。它的基本语法非常简单,直接跟上文件名即可。假设我们有一个nginx访问日志access.log,执行head access.log就会打印出日志的前10行,让你迅速确认文件格式和字段结构。
如果想自定义行数,使用-n参数。例如head -n 20 access.log表示显示前20行,也可以简写成head -20 access.log,两种写法效果完全一样。除此之外,head还有一个不太常用但很实用的参数-c,它按字节数而不是行数来截取内容,比如head -c 1024 data.bin会输出文件前1024个字节,处理二进制文件或者没有换行符的单行大文件时特别方便。
# 查看文件前10行(默认行为) head /var/log/nginx/access.log # 查看文件前50行 head -n 50 /var/log/nginx/access.log # 按字节截取,查看文件前256字节 head -c 256 /var/log/syslog
head还支持同时传入多个文件,它会在每个文件的内容前加上文件名标题,方便区分来源。例如head -n 3 a.log b.log会分别显示两个文件的前3行,并用==>符号标注文件名。这在对比多个配置文件的开头声明时非常省事。
tail命令与实时日志追踪
tail的逻辑和head正好相反,它默认输出文件的最后10行。对于日志文件来说,最重要的信息往往在末尾,因为那是最近产生的记录,所以tail在运维场景中的出镜率比head高得多。tail -n 100 error.log可以查看最近100条错误记录,快速判断服务当前的状态。
tail最强大的功能是-f选项,即follow模式。加上这个参数后,tail不会在输出完就退出,而是持续监听文件,一旦有新内容追加进来就立刻打印到屏幕上。排查一个正在运行的服务时,打开两个终端窗口,一边重启服务,一边用tail -f盯着日志,问题原因往往一眼就能看出来。想退出追踪状态,按Ctrl+C即可中断。
# 查看文件最后30行 tail -n 30 /var/log/syslog # 实时追踪日志输出,Ctrl+C退出 tail -f /var/log/nginx/error.log # 同时追踪多个日志文件 tail -f /var/log/nginx/access.log /var/log/nginx/error.log
值得一提的是-F(大写)参数。日志系统经常会做轮转(logrotate),旧的日志文件被改名归档,新的文件用原名重建。普通的小写-f盯的是文件描述符,轮转之后可能就追不到了;而大写-F会自动重新打开同名文件继续追踪,生产环境建议养成用-F的习惯。另外tail -n +5这种写法表示从第5行开始显示到文件末尾,注意加号的含义,它和-n 5的结果完全不同。
组合技巧与常见误区
head和tail真正发挥威力是在与管道结合的时候。比如想查看文件的第11到20行,可以先用head取出前20行,再用tail从中取最后10行,命令写作head -n 20 file.txt | tail -n 10。这个模式在需要截取文件中间某一段内容时非常经典。再比如统计日志中某个时间段的记录、配合grep过滤后再取首尾,都是日常高频操作。
# 查看文件第101到200行的内容 head -n 200 app.log | tail -n 100 # 找出包含ERROR的记录,并只看最新5条 grep "ERROR" app.log | tail -n 5 # 配合wc统计head取出的行数 head -n 1000 app.log | wc -l
新手常犯的一个误区是混淆行数参数的方向。tail -n 10是取最后10行,而tail -n +10是从第10行开始取到结尾,多一个加号语义天差地别。另一个误区是直接用tail -f去追踪一个不存在的文件,命令会报错退出,这时可以改用tail -F或者确保文件已创建。还有一点需要注意,head和tail处理的是文本行,如果文件里混入了超长单行(比如压缩数据被误当日志查看),输出可能刷屏,此时改用-c参数按字节截取会更安全。
掌握这两个命令后,再配合grep、wc、sort等工具,就能在纯命令行环境下完成绝大多数文件内容的快速检查工作,无需依赖任何图形界面工具,这正是Ubuntu服务器管理的日常基本功。