首页 > Sysadmin > 正文

Linux 查看文件前50行:head/sed/awk 三种方法

huyuanwen 2026-11-04 Sysadmin

用 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' 对同一文件输出一致,提前退出版本在大文件上可减少遍历。

参考资料

文中主要命令已在 WSL Ubuntu(24.04)实测并核对其在 Debian 系与通用发行版的文档口径。