Добавить в цитаты Настройки чтения

Страница 73 из 113



• pr — форматирует текст для печати.

• printf — форматирует и выводит данные.

• groff — система форматирования документов.

Инструменты простого форматирования

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

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

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

[[email protected]/* */ ~]$ 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:

[[email protected]/* */ ~]$ 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 ' '

fold — перенос строк после указанной длины

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

[[email protected]/* */ ~]$ echo "The quick brown fox jumped over the lazy dog." | fold -w 12

The quick br

own fox jump

ed over the

lazy dog.

Здесь мы видим, как действует программа fold. Текст, посланный командой echo, был разбит на сегменты указанной в параметре -w ширины. В этом примере мы ограничили ширину строк 12 символами. Если ширина не указана, по умолчанию она принимается равной 80 символам. Обратите внимание, что строки были разбиты без учета границ слов. Добавив параметр -s, можно заставить fold разбивать строки по последнему доступному пробелу перед достижением указанной ширины:

[[email protected]/* */ ~]$ echo "The quick brown fox jumped over the lazy dog." | fold -w 12 -s