Команда nl

Команда 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

Разумеется, в данном режиме также могут использоваться рассмотренные выше параметры утилиты.