Команда Linux nl: нумерация строк

LinuxBeginner
Практиковаться сейчас

Введение

В этом руководстве рассматривается команда nl в Linux, предназначенная для нумерации строк в текстовых файлах. Мы изучим её применение в различных ситуациях, чтобы упростить обращение к конкретным строкам документов. Этот навык особенно полезен программистам, системным администраторам и всем, кто регулярно работает с текстовыми файлами.

Представьте, что вы младший разработчик программного обеспечения и работаете над своим первым крупным проектом. Руководитель команды попросил вас проверить конфигурационный файл и обсудить отдельные его разделы. Команда nl поможет быстро ссылаться на нужные строки и обсуждать их, сделав совместную работу более эффективной.

Знакомство с базовой командой nl

На этом шаге вы изучите пример конфигурационного файла с помощью команды nl.

Сначала перейдите в каталог проекта. Введите следующую команду и нажмите Enter:

cd /home/labex/project

Эта команда изменит текущий каталог на /home/labex/project, где находятся файлы примеров.

Теперь используйте команду nl, чтобы просмотреть содержимое config.txt с номерами строк. Введите:

nl config.txt | tee nl-basic.txt

Вы должны увидеть вывод примерно такого вида:

     1  ## Server Configuration
     2  port=8080
     3  max_connections=100
     4
     5  ## Database Settings
     6  db_host=localhost
     7  db_port=5432
     8  db_name=myapp
     ...

Разберём, что здесь происходит:

  • Команда nl добавляет номера слева от каждой строки файла.
  • Обратите внимание: номера выровнены по правому краю в столбце шириной 6 символов.
  • Пустая строка (строка 4 в исходном файле) по умолчанию не нумеруется.
  • Команда tee выводит результат на экран и сохраняет его в nl-basic.txt.

Такая нумерация упрощает ссылки на конкретные строки при обсуждении файла с коллегами. Например, можно сказать: «Давайте посмотрим строку 2 и проверим номер порта».

Если вывод отличается или появилась ошибка, убедитесь, что вы находитесь в правильном каталоге (/home/labex/project) и что файл config.txt существует. Проверить это можно с помощью команды ls, которая выводит список файлов в текущем каталоге.

Нумерация всех строк, включая пустые

На этом шаге вы пронумеруете все строки, в том числе пустые. Это полезно, когда необходимо ссылаться на пустые строки или работать с файлами, где пустые строки имеют значение. Для этого воспользуемся параметром -b a.

Выполните следующую команду:

nl -b a config.txt | tee nl-all-lines.txt

Теперь вывод должен выглядеть примерно так:

     1  ## Server Configuration
     2  port=8080
     3  max_connections=100
     4
     5  ## Database Settings
     6  db_host=localhost
     7  db_port=5432
     8  db_name=myapp
     ...

Разберём происходящее:

  • Параметр -b управляет нумерацией строк в основной части файла.
  • Аргумент a означает «все» и указывает nl нумеровать все строки, включая пустые.
  • Обратите внимание: строка 4, которая раньше оставалась пустой и без номера, теперь получает номер.
  • Команда tee выводит результат на экран и сохраняет его в nl-all-lines.txt.

Это особенно удобно, когда нужно ссылаться на пустые строки при обсуждении файла или работать с файлами, где пустые строки имеют смысл, например с некоторыми программами и конфигурационными файлами.

Если пустая строка по-прежнему не нумеруется, проверьте, что в команде указан параметр -b a.

Настройка формата нумерации

На этом шаге вы настроите отображение номеров строк. Это может повысить читаемость вывода или подготовить его к дальнейшей обработке. Попробуем выровнять номера по правому краю и добавить ведущие нули.

Используйте параметр -n rz:

nl -n rz config.txt | tee nl-zero-padded.txt

Вывод должен выглядеть следующим образом:

000001  ## Server Configuration
000002  port=8080
000003  max_connections=100

000004  ## Database Settings
000005  db_host=localhost
000006  db_port=5432
000007  db_name=myapp

000008  ### Logging Configuration
000009  log_level=info
000010  log_file=/var/log/myapp.log

000011  ## Security Settings
000012  enable_ssl=true
000013  ssl_cert_path=/etc/ssl/certs/myapp.crt

000014  ### Performance Tuning
000015  cache_size=1024
000016  thread_pool=20

000017  ## Miscellaneous
000018  debug_mode=false

Разберём параметр -n rz:

  • -n задаёт формат нумерации.
  • r означает выравнивание по правому краю (это также используется по умолчанию).
  • z добавляет ведущие нули.
  • Команда tee выводит результат на экран и сохраняет его в nl-zero-padded.txt.

Такой формат особенно полезен, если результат нужно сортировать или дополнительно обрабатывать другими командами: фиксированная ширина поля обеспечивает единообразное выравнивание.

Если ваш вывод отличается, убедитесь, что команда введена правильно, включая параметр -n rz.

Нумерация определённых типов строк

На этом шаге вы с помощью nl пронумеруете только определённые типы строк. Это особенно полезно при работе со сложными файлами, когда нужно сосредоточиться на конкретных строках. Мы пронумеруем только непустые строки, которые не начинаются с символа # — обычно он обозначает комментарии в конфигурационных файлах.

Используйте следующую команду:

nl -b p'^[^#]' config.txt | tee nl-settings-only.txt

Вы должны увидеть вывод примерно такого вида:

       ## Server Configuration
     1  port=8080
     2  max_connections=100

       ## Database Settings
     3  db_host=localhost
     4  db_port=5432
     5  db_name=myapp

       ### Logging Configuration
     6  log_level=info
     7  log_file=/var/log/myapp.log

       ## Security Settings
     8  enable_ssl=true
     9  ssl_cert_path=/etc/ssl/certs/myapp.crt

       ### Performance Tuning
    10  cache_size=1024
    11  thread_pool=20

       ## Miscellaneous
    12  debug_mode=false

Разберём эту составную команду:

  • -b p указывает nl нумеровать только строки, соответствующие определённому шаблону.
  • '^[^#]' — это регулярное выражение:
    • ^ означает «начало строки»;
    • [^#] означает «любой символ, кроме #»;
    • вместе они выбирают любую строку, которая не начинается с #.
  • Команда tee выводит результат на экран и сохраняет его в nl-settings-only.txt.

Эта команда полезна, когда нужно сосредоточиться на активных параметрах конфигурации и не учитывать комментарии. Она особенно удобна для больших конфигурационных файлов, в которых требуется быстро найти и указать фактические настройки.

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

Сочетание параметров для сложной нумерации

На этом шаге вы объедините несколько параметров nl, чтобы создать более сложную схему нумерации. Все строки будут пронумерованы, формат номеров будет изменён, а ширина поля номера задана явно.

Выполните следующую команду:

nl -b a -n rz -s ': ' -w 3 config.txt | tee nl-combined.txt

Эта команда выполняет следующие действия:

  • -b a: нумерует все строки, включая пустые;
  • -n rz: выравнивает номера по правому краю и добавляет ведущие нули;
  • -s ': ': использует : в качестве разделителя между номером и содержимым строки;
  • -w 3: задаёт ширину поля номера в 3 символа.

Вы должны увидеть вывод примерно такого вида:

001: ## Server Configuration
002: port=8080
003: max_connections=100
004:
005: ## Database Settings
006: db_host=localhost
007: db_port=5432
008: db_name=myapp
009:
010: ### Logging Configuration
011: log_level=info
012: log_file=/var/log/myapp.log
013:
014: ## Security Settings
015: enable_ssl=true
016: ssl_cert_path=/etc/ssl/certs/myapp.crt
017:
018: ### Performance Tuning
019: cache_size=1024
020: thread_pool=20
021:
022: ## Miscellaneous
023: debug_mode=false

Разберём, что происходит:

  • Нумеруются все строки, включая пустые.
  • Номера выровнены по правому краю и дополнены ведущими нулями.
  • Между номером и содержимым строки используется разделитель : .
  • Ширина поля номера установлена равной 3 символам.
  • Результат сохраняется в nl-combined.txt.

Такая схема нумерации может быть очень полезна при работе со структурированными конфигурационными файлами или документами, разделёнными на отдельные секции. Она позволяет легко ссылаться на строки внутри нужных разделов.

Если ваш вывод не совпадает с приведённым, внимательно проверьте введённую команду, особенно пробелы и специальные символы.

Итоги

В этом руководстве мы рассмотрели команду nl и её различные параметры для нумерации строк в текстовых файлах. Мы научились:

  1. Использовать базовую команду nl для добавления номеров строк в файл.
  2. Нумеровать все строки, включая пустые, с помощью параметра -b a.
  3. Настраивать формат номеров с помощью параметра -n rz.
  4. Нумеровать определённые типы строк, используя сопоставление с шаблоном.
  5. Объединять несколько параметров для создания сложных схем нумерации.

Эти навыки помогут вам ориентироваться в конфигурационных файлах, исходном коде и любых других текстовых файлах, с которыми вы работаете в рамках проектов разработки, а также ссылаться на конкретные строки.

Другие параметры команды nl, которые не рассматривались в этом руководстве:

  • -v NUM: начинать нумерацию с NUM, а не с 1;
  • -i NUM: увеличивать номер на NUM, а не на 1;
  • -l NUM: объединять строки в группы по NUM строк и нумеровать только первую строку каждой группы;
  • -f a: нумеровать все строки заголовка — строки до первой строки основной части файла.

Эти параметры предоставляют ещё больше возможностей при работе с командой nl.