<Попередній | зміст | Наступна>
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" "Назва сторінки" "Вміст сторінки"
Заголовок сторінки
Вміст сторінки
документація