Команда nl предназначена для вызова одноименной утилиты, осуществляющей вывод содержимого текстовых файлов с нумерацией строк. Данная утилита может оказаться полезной при возникновении необходимости в выводе содержимого файлов программного кода или файлов журналов событий с помощью терминала. Она появилась еще в ранних версиях UNIX и в данный момент поставляется в составе подавляющего большинства дистрибутивов Linux по умолчанию.
Базовый синтаксис команды выглядит следующим образом:
$ nl [параметры] [файл] …
Утилита может принимать пути к одному или нескольким текстовым файлам. Что касается параметров, то параметр -b позволяет задать стиль нумерации (a — нумеровать все строки, t — нумеровать только непустые строки, n — не нумеровать строки, p — нумеровать лишь строки, соответствующие заданному регулярному выражению), параметр -n позволяет задать формат нумерации (ln — выравнивание по левому краю без начальных нулей, rn — выравнивание по правому краю без начальных нулей, rz — выравнивание по правому краю с начальными нулями), параметр -v позволяет задать начальное значение для нумерации, параметр -l позволяет указать количество пустых строк, которые будут считаться одной строкой, параметр -w позволяет задать ширину столбца с номерами строк, а параметр -s — задать формат разделителя между номером строки и самой строкой. Утилита поддерживает ряд других параметров, которые могут быть полезными лишь в исключительных случаях и едва ли пригодятся обычным пользователям.
Для вывода содержимого текстового файла с нумерацией строк достаточно использовать утилиту nl без параметров, передав ей имя текстового файла.
$ nl test.d
1 module test;
2 import std.stdio;
3 int main(string[] args)
4 {
5 writeln("Test");
6
7 return 0;
8 }
Очевидно, что с помощью данной утилиты проще читать исходный код программных продуктов. К сожалению, по умолчанию утилита не нумерует пустые строки. Но это легко исправить, использовав параметр -b, а именно передав ей параметр со значением -b a:
$ nl -b a test.d
1 module test;
2
3 import std.stdio;
4
5 int main(string[] args)
6 {
7 writeln("Test");
8
9 return 0;
10 }
Теперь утилита осуществляет нумерацию строк по аналогии с любой интегрированной средой разработки. Также вы можете активировать механизм вывода начальных нулей с помощью параметра -n, точнее, путем передачи параметра и значения -n rz:
$ nl -b a -n rz test.d
000001 module test;
000002
000003 import std.stdio;
000004
000005 int main(string[] args)
000006 {
000007 writeln("Test");
000008
000009 return 0;
000010 }
Некоторые интегрированные среды разработки выводят номера строк файлов исходного кода в представленном выше формате, поэтому данный параметр также может оказаться полезным. В дополнение имеется возможность изменить формат разделителя между номерами строк и самими строками. К примеру, вы можете предпочесть использовать точку с пробелом вместо используемого по умолчанию символа табуляции с помощью параметра -s, а точнее, с помощью параметра со значением -s ". ":
$ nl -b a -n rz -s ". " test.d
000001. module test;
000002.
000003. import std.stdio;
000004.
000005. int main(string[] args)
000006. {
000007. writeln("Test");
000008.
000009. return 0;
000010. }
Вывод стал немного компактнее, что полезно при работе с терминалом. Наконец, вы можете начать нумерацию с любого значения, если вам это необходимо. Для этой цели может использоваться параметр -v с числовым значением, соответствующим номеру первой строки:
$ nl -b a -n rz -s ". " -v 0 test.d
000000. module test;
000001.
000002. import std.stdio;
000003.
000004. int main(string[] args)
000005. {
000006. writeln("Test");
000007.
000008. return 0;
000009. }
Очевидно, что теперь нумерация начинается с нулевой строки.
Для вывода содержимого нескольких текстовых файлов с нумерацией строк достаточно передать утилите имена этих файлов.
$ nl -b a test.d test.py
1 module test;
2
3 import std.stdio;
4
5 int main(string[] args)
6 {
7 writeln("Test");
8
9 return 0;
10 }
11 #!/usr/bin/env python3
12
13 import os
14 import base64
15
16 raw_nonce = os.urandom(20)
17
18 print(raw_nonce)
19
20 nonce = base64.b64encode(raw_nonce)
21
22 print(nonce)
Очевидно, что содержимое файлов никак не разделяется.
Рассматриваемая утилита принимает текстовые данные с помощью стандартного потока ввода, что обуславливает возможность ее использования совместно с другими утилитами с интерфейсом командной строки. Для задействования данного режима достаточно не передавать ей имен каких-либо файлов. Например, вы можете создать нумерованный список файлов с заданным расширением из произвольной директории:
$ ls *.d | nl
1 arp.d
2 auth.d
3 bzlib.d
4 conctest.d
5 discovery.d
6 downloader.d
7 freetype.d
8 locks.d
9 test.d
Разумеется, в данном режиме также могут использоваться рассмотренные выше параметры утилиты.