nl 加行号
nl 是 GNU coreutils 里的行号工具,把输入按行加上序号后输出。它比 cat -n 灵活得多:默认只给非空行编号,可以用 -ba 让所有行都参与,还能调序号宽度、分隔符、起始值与步长。在给配置文件片段编号、在工单里引用具体行、把日志按行定位这类场景里,它比肉眼数行可靠得多。
基本信息
| 适用平台 | Linux(GNU coreutils);macOS 自带 BSD 版 nl,选项略少 |
|---|---|
| 语法 | nl [选项] [文件],缺省从标准输入读取 |
| 默认行为 | 只给非空行编号,等价于 -b t |
| 权限要求 | 普通用户,只读文件内容 |
典型使用场景
- 给配置片段加行号,方便在工单或群里精确定位到某一行
- 把 sed 摘出来的片段重新编号后再展示,阅读更顺
- 统计文件里有多少条有效内容行(非空行计数)
- 生成带序号的清单数据,供下游脚本按行号引用
- 临时查看某段输出时统一用冒号分隔,配合编辑器跳转习惯
常用示例
常用示例
nl -ba app.conf # 所有行都编号,包括空行
nl -w2 -s': ' app.conf # 序号宽度 2,用冒号和空格分隔
nl -bt app.conf # 只编非空行(默认行为,显式写出更好读)
sed -n '10,20p' app.conf | nl -ba # 摘出 10 到 20 行后重新编号
nl -v 100 -i 10 app.conf # 从 100 起、每行加 10
grep -c . app.conf # 只想知道有多少非空行时更直接选项逐项读法
| 选项 | 作用 | 使用注意 |
|---|---|---|
| -b a | 所有行都编号 | 脚本按行号定位时必加,否则与真实行号错位 |
| -b t | 只编非空行,缺省值 | 数行数场景反而是优点 |
| -b p正则 | 只给匹配正则的行编号 | 正则要用基础正则语法,注意转义 |
| -w | 设定序号占位宽度 | 输出给终端看时配 -w2 更整齐 |
| -s | 设定序号与内容的分隔符 | 默认是制表符,贴到聊天窗口会错乱 |
| -v 与 -i | 起始值、每次递增的步长 | 生成数据集时替代脚本自增变量 |
nl 编的是「输出流里的物理行」,不是视觉行:终端里长行折行不会产生新行号,按屏幕上的行数去核对一定会数错。
只要匹配行的行号时用 grep -n,比 nl 管道再过滤更省事;nl 更适合先拿到内容、再统一编号展示的流程。