Linux nl 命令详解:给文件添加行号的实用技巧

系统介绍 GNU `nl` 命令的参数与用法,展示其比 `cat -n` 更灵活的行号控制能力。
`nl` 是 GNU 核心工具集中用于给文件行添加编号的命令,默认只对非空行编号,这一点与 `cat -n` 的无差别编号不同。通过 `-b` 参数可控制编号范围:`-b a` 给所有行编号,`-b n` 取消编号但保留占位空格,`-b p` 则配合正则表达式只给匹配行编号,适合快速标注配置文件中的注释或特定内容。格式层面,`-i` 设置编号步长,`-w` 调整宽度,`-n` 控制对齐方式(含前导零选项),`-s` 自定义行号与内容间的分隔符。`nl` 同时支持管道输入,可为任意命令的输出添加行号,在脚本组合中颇为实用。
GNU 核心工具集里有不少低调却好用的小命令,nl 就是其中之一。它的作用一句话就能说清:给文件的每一行添加行号。但真正用起来,它比 cat -n 灵活得多,能控制编号范围、格式、增量、分隔符甚至用正则筛选行。本文基于 YouTube 频道 Video Man Pages 的演示,系统梳理 nl 命令的常用参数与实战用法。
nl 的默认行为
直接运行 nl 加文件路径,比如 nl .bashrc,它会给文件中所有非空行添加行号。这是一个容易被忽略的细节:空行默认不会获得编号,只有包含实际字符的行才会被计数。
除了直接处理文件,nl 还支持管道输入。你可以把前一个命令的输出通过管道传给它,例如 seq 10 | nl——seq 10 会打印 1 到 10 的数字序列,管道给 nl 后,每一行都会加上对应的行号。这让它在脚本和命令组合中相当实用。
nl 与 cat -n 是最常被拿来对比的两个行号工具。cat -n 对每一行(包括空行)无差别编号,行为简单直接;而 nl 天生理解"逻辑段落"的概念,默认只对有内容的行编号,更贴近人类阅读代码或配置文件时的习惯。此外,cat -n 的输出格式完全固定,nl 则通过一系列参数开放了格式控制权。两者都属于 GNU coreutils,在几乎所有 Linux 发行版上开箱即用,但 nl 因历史更久(源自 Unix System V)而在 POSIX 标准中有更正式的规范。
用 -b 控制哪些行被编号
默认跳过空行的行为可以通过 -b(body lines,正文行)参数改变。执行 nl -b a .bashrc,其中 a 表示 all(所有行),这样文件的每一行——包括空行——都会获得行号。

-b 还有一个反向用法:nl -b n(n 表示 no lines)会完全取消行号,只输出文件内容。乍看之下这和 cat 或 less 没区别,但有个微妙差异——nl -b n 仍然会为行号预留空间。默认情况下会保留六个空格的位置,就好像行号本该打印在那里一样。
用正则模式筛选要编号的行
-b 参数最强大的地方在于配合正则表达式。使用 nl -b p'模式',只有匹配该模式的行才会被编号。举个实际例子,.bashrc 本质上是个 bash 脚本,注释行都以井号 # 开头。想只给注释行编号时,可以用正则匹配以 # 开头的行,输出结果就只对这些行标注序号。

这个功能在处理配置文件、日志或代码时特别有价值,能快速定位并标记感兴趣的行。
这里的"正则模式"使用的是 POSIX 基本正则表达式(BRE)语法,与 grep 默认使用的规则相同。例如,^# 匹配以 # 开头的行,^[[:space:]]*$ 匹配纯空白行,export 匹配任意包含 export 字样的行。需要注意的是,-b p 模式下,未匹配的行同样不会被跳过——它们仍然会出现在输出中,只是不带行号,行号位置留空(仍然占用 -w 指定的宽度)。这与 grep 的过滤行为不同,nl 保留了文件的完整结构,只是选择性地标注了行号。
自定义行号格式
nl 在编号的外观上提供了很多控制选项。
增量与起始规则
默认编号是 1、2、3 递增,但你可以用 -i(increment)指定步长。nl -i5 .bashrc 会以 5 为增量编号,也就是 5、10、15、20……对于一个 238 行的文件,最终显示的编号可能达到 1180 多。演示者也坦言,这个功能的实际使用场景确实不多,但它体现了 nl 设计上的灵活性。

宽度控制
前面提到默认为行号预留六个空格。-w(width)可以调整这个宽度。nl -w8 会预留八个空格,而 nl -w3 则只保留三个。对于一个只有两百多行的文件,三位宽度已经足够,用 -w3 能去掉多余的前导空格,让输出更紧凑。
数字对齐与前导零
-n(number format)控制行号的对齐方式,有几种取值:
rz:右对齐并带前导零(如000238)rn:右对齐、无前导零,最接近默认样式ln:左对齐、无前导零,去掉了行号前的空白填充

通过组合这些格式,你可以让输出符合各种排版需求。
修改分隔符
默认情况下,行号与行内容之间用制表符(Tab)分隔。-s(separator)允许你指定其他分隔符。比如 nl -s'|' .bashrc 会用竖线代替 Tab,但直接紧贴看起来会有点乱。改成 nl -s' | '(前后加空格)就清爽多了。分隔符可以是任意字符,冒号、空格、符号都行,方便你把输出对接到其他工具或格式中。
在 Shell 中为 -s 传入含空格的参数时,引号的使用方式需要留意。nl -s' | ' 中的单引号告诉 Shell 将空格、竖线、空格作为一个整体字符串传递,避免空格被解析为参数分隔符。如果需要使用制表符本身(还原默认但明确指定),可以写成 nl -s$'\t',利用 Bash 的 $'...' ANSI-C 引用语法。这种引号技巧在组合多个参数时同样适用,是命令行操作中值得记住的基础细节。
小结
nl 是一个看似简单却颇有深度的命令。它不只是给文件加行号,还能:
- 用
-b控制编号范围(全部、无、或正则匹配) - 用
-i设置编号增量 - 用
-w调整行号宽度 - 用
-n控制对齐与前导零 - 用
-s自定义分隔符
想深入了解全部参数,随时可以在终端输入 man nl 查阅手册页。掌握这类小工具,往往能在日常命令行操作中节省不少时间。
相关推荐

从 ownCloud 迁移:自建 5 副本 3 地备份的家庭 NAS 实践
一位 Reddit 用户分享了从 WD MyCloud 到自建 ownCloud 的完整历程,展示三地五副本的 ZFS+Proxmox 备份架构,并深入探讨 ownCloud 客户端停止支持经典版后向 OCIS、Nextcloud、OpenCloud 迁移的抉择。

Agent Skills 是什么?从理解到定制的开发入门指南
Agent Skills 是智能体开发中的重要一环。本文解析 Skill 的概念、在 Claude Code 等 Agent 生态中的位置,以及从理解、定制到应用的三步学习路径,帮助零基础开发者快速入门。

Omarion SEC CLI:自愈式自主智能体如何解决AutoGPT顽疾
Omarion SEC CLI 是一款开源自主命令行智能体,通过长期记忆、执行指纹自愈、目标评估门和意图路由,解决 AutoGPT 类工具的错误循环、终端杂乱与会话失忆问题。本文解析其架构设计与三阶段演进。