nl默认只给非空行编号,因按逻辑页切分且正文部分仅对非空行编号(-b t),与cat -n对所有行编号不同;需加-b a编号空行,-p避免分页重置行号。

nl 默认只给非空行编号,不是所有行都标号
很多人用 nl 时发现空行没编号,以为命令出错,其实是默认行为。它把输入按“逻辑页”切分(头/正文/页脚),且只对正文部分的非空行编号(-b t),这是和 cat -n 最关键的区别。
常见错误现象:用 nl file.txt 后发现中间跳号,或空行没数字——不是 bug,是设计如此。
- 想给所有行编号(含空行):加
-b a - 想跳过空行但保留编号连续性(比如日志里空行只是分隔):用
-b t(默认,不用写) - 想只给匹配某模式的行编号:用
-b p'^[[:digit:]]'这类正则(注意 BRE 语法)
行号靠右对齐、带前导零要配 -n rz 和 -w
nl 默认行号右对齐、无补零(-n rn),宽度固定为 6 字符。如果文件超千行,行号会顶到文本前;如果想统一显示为 001、002 这种格式,必须同时指定格式和宽度。
容易踩的坑:-n rz 单独用没效果,因为默认宽度还是 6,小数字前面一堆空格;必须配 -w 3 才能真正输出三位补零。
- 输出三位补零行号:
nl -b a -n rz -w 3 file.txt - 左对齐不补零(适合管道后接
awk解析):nl -b a -n ln -w 4 file.txt - 分隔符改成冒号而非制表符:
nl -s ':' file.txt
行号不重置、跨段连续计数要用 -p
如果文件里有分页符(比如 \f)或用了自定义分节符(-d),nl 默认会在每个“逻辑页”开头重置行号为 1。这在处理多段日志或文档时容易造成混淆。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
例如:echo -e "a\n\f\nb" | nl 输出是 1 a 和 1 b,而不是 1 a、2 b。
- 让行号全局连续不重置:
nl -p file.txt - 配合起始值使用:
nl -p -v 100 file.txt(从 100 开始,一直加下去) - 注意:
-p不影响-b行号开关逻辑,只管是否重置
nl 和 cat -n 的核心差异就在 -b 和 -p
多数人想用 nl 替代 cat -n,但直接敲 nl file 会漏空行、遇分页符重计数——这不是缺陷,而是它面向结构化文本的设计取舍。
真正等价于 cat -n 的写法是:nl -b a -p。前者解决空行问题,后者解决分页重置问题。少了任一,输出就和 cat -n 不一致。
实际用的时候,别硬记参数组合,先确认:你要编号的对象是「所有物理行」还是「有意义的非空行」?要不要跨段连续?这两个问题答完,-b 和 -p 就自然选出来了。

















