[控场AI]
· 5 分钟阅读· 2,708 字

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

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 a 给所有行编号,包括空行

-b 还有一个反向用法:nl -b n(n 表示 no lines)会完全取消行号,只输出文件内容。乍看之下这和 cat 或 less 没区别,但有个微妙差异——nl -b n 仍然会为行号预留空间。默认情况下会保留六个空格的位置,就好像行号本该打印在那里一样。

用正则模式筛选要编号的行

-b 参数最强大的地方在于配合正则表达式。使用 nl -b p'模式',只有匹配该模式的行才会被编号。举个实际例子,.bashrc 本质上是个 bash 脚本,注释行都以井号 # 开头。想只给注释行编号时,可以用正则匹配以 # 开头的行,输出结果就只对这些行标注序号。

用 -b p 加正则模式筛选特定行编号

这个功能在处理配置文件、日志或代码时特别有价值,能快速定位并标记感兴趣的行。

这里的"正则模式"使用的是 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 设计上的灵活性。

用 -i5 设置行号增量为 5

宽度控制

前面提到默认为行号预留六个空格。-w(width)可以调整这个宽度。nl -w8 会预留八个空格,而 nl -w3 则只保留三个。对于一个只有两百多行的文件,三位宽度已经足够,用 -w3 能去掉多余的前导空格,让输出更紧凑。

数字对齐与前导零

-n(number format)控制行号的对齐方式,有几种取值:

  • rz:右对齐并带前导零(如 000238)
  • rn:右对齐、无前导零,最接近默认样式
  • ln:左对齐、无前导零,去掉了行号前的空白填充

用 -n rn 右对齐无前导零,接近默认样式

通过组合这些格式,你可以让输出符合各种排版需求。

修改分隔符

默认情况下,行号与行内容之间用制表符(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 查阅手册页。掌握这类小工具,往往能在日常命令行操作中节省不少时间。

#nl命令#Linux行号#GNU核心工具#命令行技巧#bash#文件行号#终端命令
分享:

相关推荐