应使用 head 而非 cat -10,因 cat 不支持行数截断;head 默认输出前 10 行,推荐用 head -n n 保证可移植性;处理空文件或行数不足时静默输出,二进制文件需谨慎;头尾各 10 行须分两次调用 head 和 tail。

直接用 head,别写 cat -10
head 就是干这事的,默认输出前 10 行,不加任何参数就能用。
cat -10 是错的:cat 根本不支持 -10 这种行数截断语法,会报错:
cat: invalid option -- '1' 或类似提示。
常见错误场景:
- 把 head -10 记混成 cat -10
- 在脚本里硬编码 cat 加数字,结果在不同 shell 下行为不一致
正确写法就一条命令:head filename(默认 10 行)或显式写 head -n 10 filename
head -n 和 head -N 的区别
-n 是 POSIX 标准选项,必须带数字,比如 head -n 5;
-5 是 -n 5 的简写形式,很多系统支持,但不是所有环境都兼容(比如某些 Alpine 容器镜像或老版本 BusyBox)。
建议统一用 head -n N,避免以下问题:
-
head -5 file.txt在部分嵌入式系统里会报错:head: option requires an argument -- '5' - 脚本可移植性差,CI/CD 环境换基础镜像后突然失败
- 和
tail -5混用时,容易误以为两者行为完全对称(其实tail -5更普遍支持,但依然不推荐依赖)
大文件、空文件、二进制文件怎么处理
head 不加载整个文件,只读到目标行就停,所以对 GB 级日志也很快。
但要注意边界情况:
- 空文件:head -n 10 empty.txt 静默输出空(无报错,也没提示)
- 行数不足:比如只有 3 行,head -n 10 就只输出这 3 行,不会补空行
- 二进制文件:head /bin/ls 可能输出乱码甚至破坏终端显示,建议先用 file /bin/ls 确认类型,或加 -c 限制字节数,比如 head -c 64 /bin/ls想看前 10 行 + 后 10 行,别用管道拼 head | tail
head -n 10 file | tail -n 10 实际只输出前 10 行里的最后 10 行——也就是全部 10 行,没达到“头尾各 10 行”的目的。
真正要头尾都看,得分开执行:
head -n 10 fileecho "=== SPLIT ==="tail -n 10 file
或者用 sed,但可读性差、难维护:sed -n '1,10p; $p' file(前 10 行 + 最后 1 行,不是最后 10 行)
最稳妥的方式还是两个命令分两次调用,尤其在自动化脚本里,逻辑清晰、结果可控。











