Онлайн-рабочие станции OnWorks Linux и Windows

Логотип

Бесплатный хостинг в Интернете для рабочих станций

<Предыдущая | Содержание: | Следующая>

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 "" Заголовок страницы "" Контент страницы "

Заголовок страницы

Содержание страницы


Лучшие облачные вычисления для ОС в OnWorks: