nl
2022-09-05 21:25:40 # 操作系统 # Linux # shell # 常用命令 # 文件展示命令

1. 命令作用

nl命令允许可以把文本内容打印出来,同时可以给内容加上行号,相比cat命令,你可以控制行号的很多细节(比如对齐方式,显示字符宽度等),同时nl命令可以让你通过几个标号定义逻辑页,可以作为文本的格式化输出工具。

2. 命令格式

1
nl [options]... [file]...

当没有给出文件名称,或者使用-作为文件名称的时候,则nl显示标准输入的内容。

3. 原理解释

nl命令把所有的文件内容看作一整个文档显示,根据分隔标记,把整个文档标记成页的不同部分,即header,body,footer。

header的分隔符是“:::”,body分割符“::”,footer的分割符是“:”,如果组成footer分割符的两个字符分别是ab的话,那么header的分割符就是ababab,body的就是abab。

分割符独占一行,即紧跟着每一种分割符的内容被认为是对应的页的部分,直到遇到其他分割符。例如一个文本的内容如下:

1
2
3
4
5
6
7
8
aaa
\:\:\:
bbb
\:\:
ccc
123
\:
ddd
  • bbb属于header
  • ccc 123属于body
  • ddd属于footer

第一个分隔符之前的内容也属于body,即aaa是body部分。当然header,body,footer可以在不同文件中。nl在显示文本的时候,会把分隔符替换为空行,默认只会对body添加行号。

4. 选项

4.1. -b或 --body-numbering-style

指定body部分的行号添加策略,style有如下几个选择:

  • a:为所有行添加行号
  • b:只为非空行添加行号,body默认是这个
  • n:不添加行号

类似的,也可以指定header和footer的行号策略,选项分别如下:

  • -f style 或 --footer-numbering=style 指定footer的行号策略;
  • -h style 或 --header-numbering=style 指定header的行号策略

4.2. -d cd或 --section-delimiter=cd

这个选项指定分隔符,注意cd是两个字符,这样的话,cdcdcd后面的部分是header,cdcd后面的部分是body,cd后面的部分是footer了。默认情况下c=‘\’,d=‘:’,一般来说分隔符只能指定两个字符,当使用GNU扩展的时候,可以指定多个字符,也可以指定为空字符串(此时将禁用页分区的功能了)。

4.3. -i number或--line-increment=number

这个选项指定行号的增量,例如初始行号是1,那么下一行是2,此时增量为1(默认是1),也可以指定负数。

4.4. -l number或--join-blank-lines=number

当有至少number个连续的空行的时候,只为最后一个空行设置行号,当连续空行个数小于number的时候,不为这些空行设置行号。空行指的是这一行,除了换行符以外,没有其他字符。

4.5. -n format 或 --number-format=format

指定行编号的样式,format有如下几个可选的值:

  • ln:左对齐,没有前导0
  • rn:右对齐,没有前导0(默认)
  • rz:右对齐,右前导0

nl输出的每一行的格式可以描述为这样:

行号区域 行号和内容的分隔区域 内容其区域

其中行号区域默认是6字符宽度,当我们的行号从一个比较小的数开始的时候,比如1,那么这个1是如何放置?

其中左对齐即(x表示空出来的字符):

1xxxxx 行号和内容的分隔区域 内容其区域

右对齐是:

xxxxx1 行号和内容的分隔区域 内容其区域,

右对齐,有前导0,即:

000001 行号和内容的分隔区域 内容其区域,

4.6. -p 或 --no-renumber

这个选项指定了当一个新的页开始的时候,行号不要从新开始。一般来说,我们可以定义多个header,body和footer,当上一个footer结束,下一个header开始的时候,即为新的一页,新的页开始的时候,行号从新开始的。

4.7. -s string 或 --number-separator=string

上面说了,nl输出的每一行的行号和内容之间有分隔区域,这个选项设置行号和行内容之间的分隔区域,默认是TAB,可以指定任何字符串。

4.8. -v number 或 --starting-line-number=number

设置行号的初始值,默认是1

4.9. -w number 或 --number-width=number

上面说了,nl输出的每一行的行号区域默认是6字符宽度,这个选项用来设置行号区域的字符宽度。