nl — нумерация строк

We use cookies. Read the Privacy and Cookie Policy

Программа nl — предназначена для решения простой задачи: она выполняет нумерацию строк. В простейшем случае использования nl напоминает команду cat -n:

[me@linuxbox ~]$ nl distros.txt | head

1 SUSE 10.2 12/07/2006

2 Fedora 10 11/25/2008

3 SUSE 11.0 06/19/2008

4 Ubuntu 8.04 04/24/2008

5 Fedora 8 11/08/2007

6 SUSE 10.3 10/04/2007

7 Ubuntu 6.10 10/26/2006

8 Fedora 7 05/31/2007

9 Ubuntu 7.10 10/18/2007

10 Ubuntu 7.04 04/19/2007

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

nl поддерживает идею логических страниц. Это дает возможность начинать нумерацию на каждой странице заново. С помощью параметров можно определить номер первой строки и протяженность нумерации, а также формат номеров. Логическую страницу можно разбить на заголовок, тело и нижний колонтитул. В каждом разделе нумерация может начинаться с начала и/или использоваться разный формат нумерации. Если программе nl передать несколько файлов, она будет интерпретировать их как один поток текста. Разделы в потоке выделяются добавлением в поток немного странной разметки, как показано в табл. 21.1.

Таблица 21.1. Разметка nl

Разметка

Значение

:::

Начало заголовка логической страницы

::

Начало тела логической страницы

:

Начало нижнего колонтитула логической страницы

Каждый элемент разметки из представленных в табл. 21.1 должен находиться в отдельной строке. После обработки элемента программа nl удалит его из потока текста.

В табл. 21.2 перечислены наиболее часто используемые параметры nl.

Таблица 21.2. Наиболее часто используемые параметры nl

Параметр

Значение

-b стиль

Стиль нумерации тела, где аргумент стиль может иметь следующие значения:

a — нумеровать все строки;

t — нумеровать только непустые строки. Этот стиль применяется по умолчанию;

n — не нумеровать;

регулярное выражение — нумеровать только строки, соответствующие простому регулярному выражению

-f стиль

Стиль нумерации нижнего колонтитула. По умолчанию имеет значение n (нет нумерации)

-h стиль

Стиль нумерации заголовка. По умолчанию имеет значение n (нет нумерации)

-i число

Шаг приращения номеров на странице. По умолчанию имеет значение 1

-n формат

Формат номеров, где аргумент формат может иметь следующие значения:

ln — с выравниванием по левому краю, без ведущих нулей;

rn — с выравниванием по правому краю, без ведущих нулей. Используется по умолчанию;

rz — с выравниванием по правому краю, с ведущими нулями

-p

Не сбрасывать нумерацию в начале каждой логической страницы

-s строка

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

-v число

Номер первой строки на каждой логической странице. По умолчанию имеет значение 1

-w ширина

Ширина поля номера строки. По умолчанию имеет значение 6

Следует отметить, что на практике нумеровать строки приходится довольно редко, но мы можем использовать nl, чтобы посмотреть, как объединить несколько инструментов для решения более сложных задач. Возьмем за основу наши наработки, созданные в предыдущей главе для получения отчета о дистрибутивах Linux. Поскольку далее мы будем использовать программу nl, включим в текст разметку, отделяющую заголовок/тело/нижний колонтитул. Для этого откройте в текстовом редакторе сценарий для sed из предыдущей главы, добавьте в него строки с разметкой, как показано ниже, и сохраните сценарий в файле с именем distros-nl.sed:

# Сценарий для sed, создающий отчет о дистрибутивах Linux

1 i

:::

Linux Distributions Report

Name Ver. Released

---- ---- --------

::

s/([0-9]{2})/([0-9]{2})/([0-9]{4})$/3-1-2/

$ a

:

End Of Report

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

Теперь выведем улучшенный отчет, объединив sort, sed и nl:

[me@linuxbox ~]$ sort -k 1,1 -k 2n distros.txt | sed -f distros-nl.sed | nl

Linux Distributions Report

Name Ver. Released

---- ---- --------

1 Fedora 5 2006-03-20

2 Fedora 6 2006-10-24

3 Fedora 7 2007-05-31

4 Fedora 8 2007-11-08

5 Fedora 9 2008-05-13

6 Fedora 10 2008-11-25

7 SUSE 10.1 2006-05-11

8 SUSE 10.2 2006-12-07

9 SUSE 10.3 2007-10-04

10 SUSE 11.0 2008-06-19

11 Ubuntu 6.06 2006-06-01

12 Ubuntu 6.10 2006-10-26

13 Ubuntu 7.04 2007-04-19

14 Ubuntu 7.10 2007-10-18

15 Ubuntu 8.04 2008-04-24

16 Ubuntu 8.10 2008-10-30

End Of Report

Наш отчет является результатом объединения в конвейер нескольких команд. Сначала мы отсортировали список по названиям дистрибутивов и номерам версий (поля 1 и 2), затем обработали результат программой sed, добавив заголовок отчета (включая разметку логических страниц для nl) и нижний колонтитул. В заключение мы обработали результат с помощью программы nl, которая по умолчанию нумерует только строки в потоке текста, принадлежащие разделу с телом логической страницы.

Попробуйте повторить команду и поэкспериментировать с разными параметрами команды nl. Интересный результат, например, можно получить с помощью

nl -n rz

и

nl -w 3 -s ' '