Уильям Шоттс - Командная строка Linux. Полное руководство
380
"%010.5f"
0380.00000
Ширина поля вывода увеличена до 10, вследствие чего появился ведущий нуль
380
"%+d"
+380
Флаг + требует выводить знак у положительных чисел
380
"%-d"
380
Флаг - обеспечивает форматирование с выравниванием по левому краю
abcdefghijk
"%5s"
abcdefghijk
Форматирование строки в поле с указанной минимальной шириной
abcdefghijk
"%.5s"
фисву
Применение компонента точности к строке привело к ее усечению
И еще раз: команда printf в основном используется в сценариях, где применяется для форматирования табличных данных, а не как самостоятельный инструмент командной строки. Тем не менее мы можем использовать ее для решения различных задач форматирования. Во-первых, попробуем вывести несколько полей, разделив их символами табуляции:
[[email protected] ~]$ printf "%st%st%sn" str1 str2 str3
str1 str2 str3
Добавив t (экранированную последовательность, соответствующую символу табуляции), мы достигли желаемого эффекта. Затем попробуем вывести несколько чисел в форматированном виде:
[[email protected] ~]$ printf "Line: %05d %15.3f Result: %+15dn" 1071 3.14156295 32589
Line: 01071 3.142 Result: +32589
Здесь демонстрируется действие компонента, определяющего минимальную ширину поля. А можно ли подобным образом отформатировать небольшую веб-страницу?
[[email protected] ~]$ printf "<html>nt<head>ntt<title>%s</title>nt</head>
nt<body>ntt
%s
nt</body>n</html>n" "Page Title" "Page Content"<html>
<head>
<title>Page Title</title>
</head>
<body>
Page Content
</body>
</html>
Системы форматирования документов
До сих пор мы исследовали простые инструменты форматирования текста. Они хорошо подходят для решения небольших и простых задач, но как быть с более сложными заданиями? Одна из причин большой популярности операционной системы Unix среди технических специалистов и научных работников (кроме мощной поддержки многозадачности и многопользовательского окружения для выполнения любых работ, связанных с разработкой программного обеспечения) состоит в наличии инструментов, которые можно использовать для создания самых разных документов, таких как научные и академические публикации. Фактически, как описывается в документации GNU, средства подготовки документов положительно сказались на разработке Unix:
Первая версия UNIX была создана на машине PDP-7, простаивавшей в Bell Labs. В 1971-м разработчики захотели заполучить PDP-11 для дальнейшей работы над операционной системой. Чтобы оправдать затраты на эту систему, они внесли предложение о реализации системы форматирования документов для патентного бюро в AT&T. Эта первая программа форматирования являлась переделкой программы roff Макиллроя (McIllroy), которую написал Д.Ф. Оссанна (J. F. Ossanna).
Семейство программ roff и TEX
В области систем форматирования документов доминируют два основных семейства программ: уходящие корнями в оригинальную программу roff, включая nroff и troff, и основанные на системе верстки Дональда Кнута TEX (произносится как «тек»). И да, буква «E» в середине имени действительно смещена вниз.
Имя roff произошло от словосочетания «run off» (напечатать), как во фразе: «Я напечатал копию для вас». Программа nroff используется для форматирования документов перед выводом на устройства, использующие моноширинные шрифты, такие как алфавитно-цифровые терминалы и принтеры, действующие подобно пишущим машинкам. На момент появления программы такие устройства составляли подавляющее большинство устройств вывода, подключаемых к компьютерам. Позднее появилась программа troff, форматирующая документы для вывода на наборные устройства, используемые для производства «готовых к тиражированию» макетов. Большинство современных принтеров способны имитировать вывод таких наборных устройств. Семейство roff также включает ряд других программ для подготовки фрагментов документов. К их числу относятся eqn (для форматирования математических формул) и tbl (для форматирования таблиц).
Система TEX (в версии, готовой к эксплуатации) впервые появилась в 1989 году и, до определенной степени, заменила troff как инструмент для получения документов типографского качества. Мы не будем рассматривать систему TEX здесь, во-первых, из-за ее сложности (существуют целые книги, посвященные ей) и, во-вторых, из-за того, что в большинстве современных систем Linux она не устанавливается по умолчанию.
ПРИМЕЧАНИЕ
Если у вас появится желание установить TEX, обратите внимание на пакет texlive, присутствующий в репозиториях большинства дистрибутивов, а также на редактор графического содержимого LYX.
groff — система форматирования документов
groff — это пакет программ с GNU-реализацией troff. Он также включает сценарий, имитирующий работу nroff, и остальные программы семейства roff.
Семейство roff и его потомки использовались для создания форматированных документов способом, довольно чуждым современным пользователям. Большинство документов в наше время создается в текстовых процессорах, способных осуществлять составление и оформление документов в один шаг. До появления графических текстовых процессоров создание документов обычно происходило в два этапа. Сначала в текстовом редакторе выполнялось составление документа, а затем с помощью процессора, такого как troff, осуществлялось его форматирование. Инструкции для программы форматирования встраивались в текст документа с применением языка разметки. Современным аналогом этого процесса может служить подготовка веб-страниц, которые записываются в текстовом редакторе и затем отображаются веб-браузером, интерпретирующим код HTML как инструкции языка разметки, описывающие окончательный вид страницы.
Мы не будем рассматривать семейство программ groff во всех подробностях, так как многие тонкости его языка разметки имеют прямое отношение к туманным для нас деталям типографского дела. Вместо этого мы сосредоточимся на одном из его макропакетов, широко использующемся до сих пор. Эти макропакеты упаковывают множество низкоуровневых команд в небольшое множество высокоуровневых команд, существенно упрощающих работу с groff.
Давайте ненадолго приостановимся и рассмотрим простую страницу справочного руководства (man). Она хранится в каталоге /usr/share/man в виде текстового файла, сжатого с помощью gzip. Если заглянуть на распакованное содержимое, можно увидеть следующее (здесь показана страница справочного руководства из раздела 1 для команды ls):
[[email protected] ~]$ zcat /usr/share/man/man1/ls.1.gz | head
." DO NOT MODIFY THIS FILE! It was generated by help2man 1.35.
.TH LS "1" "April 2008" "GNU coreutils 6.10" "User Commands"
.SH NAME
ls - list directory contents
.SH SYNOPSIS
.B ls
[fIOPTIONfR]... [fIFILEfR]...
.SH DESCRIPTION
." Add any additional description here
.PP
Если сравнить содержимое страницы с ее нормальным представлением на экране, можно заметить определенную корреляцию между языком разметки и результатом его интерпретации:
[[email protected] ~]$ man ls | head
LS(1) User Commands LS(1)
NAME
ls - list directory contents
SYNOPSIS
ls [OPTION]... [FILE]...
Этот пример интересен тем, что страницы справочного руководства отображаются программой groff с использованием макропакета mandoc. В действительности работу команды man можно сымитировать с помощью следующего конвейера.
[[email protected] ~]$ zcat /usr/share/man/man1/ls.1.gz | groff -mandoc -T ascii | head
LS(1) User Commands LS(1)
NAME
ls - list directory contents
SYNOPSIS
ls [OPTION]... [FILE]...
Здесь использована программа groff с множеством параметров, определяющих макропакет mandoc и драйвер вывода для ASCII. groff может выводить информацию в нескольких форматах. Если формат не задан, по умолчанию вывод производится в формате PostScript:
[[email protected] ~]$ zcat /usr/share/man/man1/ls.1.gz | groff -mandoc | head
%!PS-Adobe-3.0
%%Creator: groff version 1.18.1
%%CreationDate: Thu Feb 2 13:44:37 2012
%%DocumentNeededResources: font Times-Roman
280 Chapter 21
%%+ font Times-Bold
%%+ font Times-Italic
%%DocumentSuppliedResources: procset grops 1.18 1
%%Pages: 4
%%PageOrder: Ascend
%%Orientation: Portrait
PostScript — это язык описания страниц, используемый для вывода страниц на устройства печати с типографским качеством. Вывод команды можно сохранить в файл (здесь предполагается, что вы работаете в графическом окружении рабочего стола и в вашем домашнем каталоге имеется каталог Desktop):
[[email protected] ~]$ zcat /usr/share/man/man1/ls.1.gz | groff -mandoc > ~/Desktop/foo.ps
После выполнения этой команды на рабочем столе появляется пиктограмма файла. После двойного щелчка мышью на этой пиктограмме должен запуститься инструмент просмотра страниц и отобразить содержимое файла (рис. 21.1).
Рис. 21.1. Отображение содержимого PostScript-файла в окне обозревателя страниц в GNOME
Здесь мы видим прекрасно отформатированную страницу справочного руководства для команды ls! В действительности PostScript-файл можно преобразовать в формат PDF (Portable Document Format — формат переносимых документов), как показано ниже: