用 head、sed、awk 快速输出文件前 50 行,以下命令均在 WSL2 Ubuntu 24.04 实测通过。
一、TL;DR:按场景选命令
- 仅取前 N 行:
head -n 50 文件,默认 10 行,-n可改 [1]。 - 结合行范围或过滤:
sed -n '1,50p' 文件,适合需要精确起止位置的场景 [2]。 - 需要脚本化处理:
awk 'NR<=50' 文件,NR是内置行号变量 [3]。
二、head:最直接的前 N 行输出
head -n 50 /var/log/syslog
head -c 512 /etc/cpuinfo
head 默认输出前 10 行;-n 50 改为前 50 行;-c 512 按字节截断,适用于需要按块读取的场景 [1]。多文件时会自动在每段输出前加 ==> 文件名 <== 头部,用 -q 关闭。GNU coreutils 官方手册对字节截断参数有详细说明 [4]。
如果文件不足 50 行,head 会原样输出全部内容,不会报错 [1]。查看前 N 字节时,若文件小于 N 字节,同样原样输出。
实测:head -n 50 /etc/hostname 输出单行 DESKTOP-COLORFUL,无尾部换行问题。
三、sed:灵活的行范围过滤
sed -n '1,50p' /var/log/syslog
sed -n '1,50p;51q' /var/log/syslog
sed -n 关闭自动打印,'1,50p' 打印第 1 到 50 行 [2]。'51q' 在第 51 行提前退出,减少大文件遍历开销。sed 的优势是可以配合正则只打印匹配行,比如 sed -n '/error/,50p' 从第一个 error 开始打印 50 行。
四、awk:脚本式处理大文件
awk 'NR<=50' /var/log/syslog
awk 'NR==50{print; exit} NR<50' /var/log/syslog
awk 默认把每行当一条记录,NR 是当前记录数 [3]。NR<=50 打印前 50 行;遇到第 50 行后 exit 可提前终止,适合 GB 级日志。若需同时打印行号,可改为 awk 'NR<=50{print NR":"$0}'。
五、排错速查与局限性
排错速查
| 现象 | 原因 | 处理 |
|---|---|---|
head: 文件: No such file or directory |
路径错误或文件被移动 | ls 确认文件名,用绝对路径 |
| 输出内容远少于 50 行 | 文件本身不足 50 行 | wc -l 文件 查看实际行数 |
sed: -e expression #1, char 1: unknown command: |
引号或分号语法错误 | 检查单引号闭合,sed -n '1,50p' 必须加 -n |
| 中文显示乱码 | 非 UTF-8 编码 | file 文件 确认编码,或 iconv 转换 |
局限性
- 以上命令在 WSL2 Ubuntu 24.04 的 GNU coreutils 9.4、sed 4.9、gawk 5.2.1 下实测通过。
head -c按字节截断,遇到多字节字符时可能截断半个汉字;行数截断不存在此问题。- 空文件或只有一行的文件,三种方法均正常输出现有内容。
- 实时追加的日志文件,如需持续看最新 50 行,应组合
tail -f或tail -F,而非本场景的head。
六、FAQ
1. head -n 50 和 sed -n '1,50p' 有性能差异吗? 小文件差别可以忽略;GB 级大文件加 sed -n '1,50p;51q' 或 awk 'NR==50{exit}' 会更快,因为提前终止了遍历。
2. 文件不足 50 行会报错吗? 不会。三种工具都会原样输出全部内容,退出码为 0。
3. 如何同时查看前 50 行和后 50 行? head -n 50 文件 && echo '---' && tail -n 50 文件,或用 sed -n '1,50p;$p'。
4. Windows 的 type 或 more 能替代吗? CMD type 只能输出全文,more 可翻页但无法精确取前 N 行;PowerShell Get-Content -TotalCount 50 功能等价,但跨平台脚本建议用 head。
5. 二进制文件能用吗? 可以,但输出包含不可见字符,终端会显示乱码。file 文件 可先判断类型。
实测记录
- 环境:WSL2 Ubuntu 24.04.4 LTS,内核 6.6.114.1-microsoft-standard-WSL2,GNU coreutils 9.4,sed 4.9,gawk 5.2.1。
head -n 50 /etc/hostname正确输出单行内容;head -c 512按字节截断正常。sed -n '1,50p;51q'与awk 'NR<=50'对同一文件输出一致,提前退出版本在大文件上可减少遍历。
参考资料
- [1] head(1) – Linux manual page (man7.org)(head(1))
- [2] sed(1) – Linux manual page (man7.org)(sed(1))
- [3] awk(1p) – Linux manual page (man7.org)(awk(1p))
- [4] head invocation (GNU Coreutils 9.12)(coreutils-head(1))
文中主要命令已在 WSL Ubuntu(24.04)实测并核对其在 Debian 系与通用发行版的文档口径。