Онлайн робочі станції OnWorks Linux та Windows

логотип

Безкоштовний онлайн-хостинг для робочих станцій

<Попередній | зміст | Наступна>

printf – форматування та друк даних

На відміну від інших команд у цьому розділі, the printf Команда не використовується для конвеєрів (вона не приймає стандартного введення) і не знаходить частого застосування безпосередньо в командному рядку (в основному використовується в сценаріях). Так чому це важливо? Тому що він так широко використовується.

printf (від фрази «відформатований друк») спочатку був розроблений для мови програмування C і був реалізований на багатьох мовах програмування, включаючи оболонку. Насправді в bash printf є вбудованою програмою.

printf працює так:

printf “формат" аргументація

Команда отримує рядок, що містить опис формату, який потім застосовується до списку аргументів. Відформатований результат надсилається на стандартний вихід. Ось тривіальний приклад:



[me@linuxbox ~]$ printf "Я відформатував рядок: %s\n" foo

Я відформатував рядок: foo

[me@linuxbox ~]$ printf "Я відформатував рядок: %s\n" foo

Я відформатував рядок: foo


Рядок форматування може містити буквальний текст (наприклад, «Я відформатував рядок:»), escape-послідовності (наприклад, \n, символ нового рядка) і послідовності, які починаються з % характер, які наз специфікації перетворення. У наведеному вище прикладі специфікація перетворення %s використовується для форматування рядка «foo» та розміщення його у виводі команди. Ось воно знову:



[me@linuxbox ~]$ printf "Я відформатував "%s" як рядок.\n" foo

Я відформатував "foo" як рядок.

[me@linuxbox ~]$ printf "Я відформатував "%s" як рядок.\n" foo

Я відформатував "foo" як рядок.


Як бачимо, в %s специфікація перетворення замінюється на рядок “foo” у виводі команди. Перетворення s використовується для форматування рядкових даних. Існують інші специфікатори для інших видів даних. У цій таблиці наведено перелік типових даних, які найчастіше використовуються:


Таблиця 21-4: Загальні специфікатори типу даних printf


Опис специфікатора

Опис специфікатора

d Відформатуйте число як ціле десяткове число зі знаком.


зображення

f Відформатуйте та виведіть число з плаваючою комою.


зображення

o Відформатуйте ціле число як вісімкове число.


зображення


зображення

s Відформатуйте рядок.


зображення

x Відформатуйте ціле число як шістнадцяткове число, використовуючи малий регістр af, де потрібно.


зображення

X Такий же, як x але використовуйте великі літери.


зображення

% Надрукувати буквальний символ % (тобто вказати «%%»)


зображення


Ми продемонструємо вплив кожного з специфікаторів перетворення на рядок «380»:



[me@linuxbox ~]$ printf "%d, %f, %o, %s, %x, %X\n" 380 380 380 380

380 380

380, 380.000000, 574, 380, 17c, 17C

[me@linuxbox ~]$ printf "%d, %f, %o, %s, %x, %X\n" 380 380 380 380

380 380

380, 380.000000, 574, 380, 17c, 17C


Оскільки ми вказали шість специфікаторів перетворення, ми також повинні надати шість аргументів для

printf для обробки. Шість результатів показують вплив кожного специфікатора.

До специфікатора перетворення можна додати кілька додаткових компонентів, щоб налаштувати його вихід. Повна специфікація перетворення може складатися з наступного:

%[прапори][ширина][.точність]специфікація_перетворення

Кілька необов’язкових компонентів, якщо вони використовуються, повинні з’являтися в зазначеному вище порядку, щоб їх правильно інтерпретувати. Ось опис кожного:


Таблиця 21-5: Компоненти специфікації перетворення printf


Опис компонента

Опис компонента

прапори Існує п'ять різних прапорів:


зображення

# – Використовуйте «альтернативний формат» для виведення. Це залежить від типу даних. Для перетворення o (вісімкове число) вихідний текст має префікс

0. Для перетворення x і X (шістнадцяткове число) вихідний результат має префікс 0x або 0X відповідно.


зображення

0–(нуль) Заповнити вихід нулями. Це означає, що поле буде заповнено провідними нулями, як у «000380».


зображення

- – (тире) Вирівнювання по лівому краю. За замовчуванням printf вирівнює висновок по правому краю.


зображення

' ' – (пробіл) Утворіть провідний пробіл для додатних чисел.


зображення

+ – (знак плюса) Підпишіть додатні числа. За замовчуванням лише printf


зображення


зображення

знаки від’ємних чисел.


зображення

ширина Число, що визначає мінімальну ширину поля.


зображення

.точність Для чисел з плаваючою комою вкажіть кількість цифр точності, які потрібно вивести після десяткової коми. Для перетворення рядків, точність визначає кількість символів для виведення.


зображення


Ось кілька прикладів різних форматів у дії:


Таблиця 21-6: Приклади специфікації перетворення друку


аргументація

сформований

Результат

примітки

380

"%d"

380

Просте форматування an

ціле число.

380

"%#x"

0x17c

Ціле число у форматі a

використання шістнадцяткового числа

прапорець «альтернативний формат».

380

"%05d"

00380

Ціле число відформатовано за допомогою

провідні нулі (заповнення)

і мінімальна ширина поля

з п'яти символів.

380

"%05.5f"

380.00000

Число у форматі a

число з плаваючою комою

відступ і п’ять десяткових

місця точності. Оскільки

зазначений мінімум

ширина поля (5) менше ніж

фактична ширина

відформатований номер,

прокладка не впливає.

380

"%010.5f"

0380.00000

За рахунок збільшення

мінімальна ширина поля до 10

заповнення тепер видно.

380

"%+d"

+380

Прапорець + означає позитив

номер.

380

"%-d"

380

Прапорець - вирівнює ліворуч

форматування.


abcdefghijk

"%5s"

abcedfghijk

Рядок, відформатований з мінімальною шириною поля.

abcdefghijk

"%.5s"

абсід

Застосовуючи точність до рядка, він усікається.


Знову ж таки, printf використовується в основному в сценаріях, де він використовується для форматування табличних даних, а не безпосередньо в командному рядку. Але ми все ще можемо показати, як його можна використовувати для вирішення різних проблем форматування. Спочатку виведемо деякі поля, розділені символами табуляції:



[me@linuxbox ~]$ printf "%s\t%s\t%s\n" str1 str2 str3

str1 str2 str3

[me@linuxbox ~]$ printf "%s\t%s\t%s\n" str1 str2 str3

str1 str2 str3


Вставивши \t (екранна послідовність для вкладки), ми досягаємо бажаного ефекту. Далі кілька чисел з акуратним форматуванням:



[me@linuxbox ~]$ printf "Рядок: %05d %15.3f Результат: %+15d\n" 1071 3.14156295 32589

Лінія: 01071 3.142 Результат: +32589

[me@linuxbox ~]$ printf "Рядок: %05d %15.3f Результат: %+15d\n" 1071 3.14156295 32589

Лінія: 01071 3.142 Результат: +32589


Це показує вплив мінімальної ширини поля на відстань між полями. Або як щодо форматування крихітної веб-сторінки:



[me@linuxbox ~]$ printf " \n\t \n\t\t %s \n

\t \n\t \n\t\t %s \n\t \n \n" "Назва сторінки" "Вміст сторінки"

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

Вміст сторінки

[me@linuxbox ~]$ printf " \n\t \n\t\t %s \n

\t \n\t \n\t\t %s \n\t \n \n" "Назва сторінки" "Вміст сторінки"

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

Вміст сторінки


Найпопулярніші хмарні обчислення ОС на OnWorks: