<Предыдущая | Содержание: | Следующая>
printf - Форматирование и печать данных
В отличие от других команд в этой главе, Printf Команда не используется для конвейеров (она не принимает стандартный ввод) и не находит частого применения непосредственно в командной строке (в основном используется в сценариях). Так почему это важно? Потому что он так широко используется.
printf (от фразы «print formatted») изначально разрабатывался для языка программирования C и был реализован во многих языках программирования, включая оболочку. Фактически, в bash printf является встроенным.
printf работает так:
printf «формат Аргументы
Команде дается строка, содержащая описание формата, которое затем применяется к списку аргументов. Отформатированный результат отправляется на стандартный вывод. Вот банальный пример:
[я @ linuxbox ~] $ printf "Я отформатировал строку:% s \ n" foo
Я отформатировал строку: foo
[я @ linuxbox ~] $ printf "Я отформатировал строку:% s \ n" foo
Я отформатировал строку: foo
Строка формата может содержать буквальный текст (например, «Я отформатировал строку:»), escape-последовательности (например, \n, символ новой строки) и последовательности, начинающиеся с % персонажей, которые называются спецификации преобразования. В приведенном выше примере спецификация преобразования %s используется для форматирования строки «foo» и помещения ее в вывод команды. И снова:
[я @ linuxbox ~] $ printf "Я отформатировал '% s' как строку. \ n" foo
Я отформатировал foo как строку.
[я @ linuxbox ~] $ printf "Я отформатировал '% s' как строку. \ n" foo
Я отформатировал foo как строку.
Как видим, %s спецификация преобразования заменяется строкой «foo» в выводе команды. Преобразование s используется для форматирования строковых данных. Есть и другие спецификаторы для других типов данных. В этой таблице перечислены наиболее часто используемые типы данных:
Таблица 21-4: Общие спецификаторы типов данных printf
Спецификатор Описание
Спецификатор Описание
d Форматировать число как десятичное целое число со знаком.
f Отформатируйте и выведите число с плавающей запятой.
o Форматировать целое число как восьмеричное число.
s Отформатируйте строку.
x Форматируйте целое число как шестнадцатеричное, используя строчные буквы af там, где это необходимо.
X Такой же как x но используйте прописные буквы.
% Вывести буквальный символ% (т.е. указать «%%»)
Мы продемонстрируем влияние каждого из спецификаторов преобразования на строку «380»:
[я @ linuxbox ~] $ printf "% d,% f,% o,% s,% x,% X \ n" 380 380 380 380
380 380
380, 380.000000, 574, 380, 17с, 17с
[я @ linuxbox ~] $ printf "% d,% f,% o,% s,% x,% X \ n" 380 380 380 380
380 380
380, 380.000000, 574, 380, 17с, 17с
Поскольку мы указали шесть спецификаторов преобразования, мы также должны предоставить шесть аргументов для
printf для обработки. Шесть результатов показывают влияние каждого спецификатора.
К спецификатору преобразования можно добавить несколько необязательных компонентов, чтобы отрегулировать его выход. Полная спецификация преобразования может состоять из следующего:
%[Флаги][ширина][.точность] спецификация_конверсии
При использовании нескольких необязательных компонентов они должны появляться в указанном выше порядке, чтобы их можно было правильно интерпретировать. Вот описание каждого из них:
Таблица 21-5: Компоненты спецификации преобразования printf
Компонент Описание
Компонент Описание
flags Есть пять разных флагов:
# - Используйте «альтернативный формат» для вывода. Это зависит от типа данных. Для преобразования o (восьмеричное число) вывод имеет префикс
0. Для преобразований x и X (шестнадцатеричное число) к выходным данным добавляется префикс 0x или 0X соответственно.
0– (ноль) Дополнить вывод нулями. Это означает, что поле будет заполнено ведущими нулями, как в «000380».
- - (тире) Выровнять вывод по левому краю. По умолчанию printf выравнивает вывод по правому краю.
'' - (пробел) Создает начальный пробел для положительных чисел.
+ - (знак плюса) Знак положительных чисел. По умолчанию только printf
подписывает отрицательные числа.
width Число, указывающее минимальную ширину поля.
.точность Для чисел с плавающей запятой укажите количество цифр точности, которое будет выводиться после десятичной запятой. Для преобразования строки точность указывает количество выводимых символов.
Вот несколько примеров использования различных форматов:
Таблица 21-6: Примеры спецификаций преобразования печати
Аргумент | Формат | Результат | Заметки |
380 | "% d" | 380 | Простое форматирование |
целое число. | |||
380 | "%#Икс" | 0x17c | Целое число в формате |
шестнадцатеричное число с использованием | |||
флаг «альтернативный формат». | |||
380 | "% 05d" | 00380 | Целое число, отформатированное с помощью |
ведущие нули (заполнение) | |||
и минимальная ширина поля | |||
из пяти персонажей. | |||
380 | "% 05.5f" | 380.00000 | Число в формате |
число с плавающей запятой с | |||
заполнение и пять десятичных знаков | |||
места точности. С | |||
указанный минимум | |||
ширина поля (5) меньше | |||
фактическая ширина | |||
форматированный номер, | |||
заполнение не имеет никакого эффекта. | |||
380 | "% 010.5f" | 0380.00000 | Увеличивая |
минимальная ширина поля до 10 | |||
отступ теперь виден. | |||
380 | "% + d" | +380 | Флаг + означает положительный |
номер. | |||
380 | "% -d" | 380 | Флаг - слева выравнивает |
форматирование. |
abcdefghijk | "% 5s" | abcedfghijk | Строка, отформатированная с минимальной шириной поля. |
abcdefghijk | "% .5s" | ABCDE | Применяя точность к строке, она усекается. |
Опять же, Printf используется в основном в сценариях, где он используется для форматирования табличных данных, а не непосредственно в командной строке. Но мы все еще можем показать, как его можно использовать для решения различных проблем форматирования. Сначала выведем несколько полей, разделенных символами табуляции:
[я @ linuxbox ~] $ printf "% s \ t% s \ t% s \ n" str1 str2 str3
стр1 стр2 стр3
[я @ linuxbox ~] $ printf "% s \ t% s \ t% s \ n" str1 str2 str3
стр1 стр2 стр3
Вставив \t (escape-последовательность для табуляции) добиваемся желаемого эффекта. Далее несколько чисел с аккуратным форматированием:
[я @ linuxbox ~] $ printf "Строка:% 05d% 15.3f Результат:% + 15d \ n" 1071 3.14156295 32589
Строка: 01071 3.142 Результат: +32589
[я @ linuxbox ~] $ printf "Строка:% 05d% 15.3f Результат:% + 15d \ n" 1071 3.14156295 32589
Строка: 01071 3.142 Результат: +32589
Это показывает влияние минимальной ширины поля на расстояние между полями. Или как насчет форматирования крошечной веб-страницы:
[я @ linuxbox ~] $ printf " \ п \ т \ п \ т \ т % s \ п
\ т \ п \ т \ п \ т \ т % s \ п \ т \ п \ n "" Заголовок страницы "" Контент страницы "
Заголовок страницы
Содержание страницы
[я @ linuxbox ~] $ printf " \ п \ т \ п \ т \ т % s \ п
\ т \ п \ т \ п \ т \ т % s \ п \ т \ п \ n "" Заголовок страницы "" Контент страницы "
Заголовок страницы
Содержание страницы