Представьте себе огромный паровой сервер — тысячи шестерёнок вращаются в такт, поршни выталкивают потоки данных, а стрелки манометров дрожат на отметках “load average”. В этом мире сырых логов, бинарных отливок и неструктурированного пара вам нужен инструмент, который превратит хаос в идеально отформатированный отчёт. Таким инструментом является printf — не просто команда, а настоящий паровой формователь данных.
В отличие от своего более простого собрата echo, который лишь выплёскивает текст в консоль как попало, printf работает как прецизионный токарный станок. Он берёт сырую заготовку — строку формата — и с ювелирной точностью впрессовывает в неё переменные, числа и спецсимволы. Хотите вывести число с плавающей точкой ровно до третьего знака? Или дополнить строку пробелами до ширины в 40 символов? Или вставить управляющий символ перевода каретки, чтобы обновлять строку статуса на лету? printf сделает это с той же надёжностью, с какой паровой молот штампует латунные заклёпки.
Для сисадмина printf — это незаменимый верстак. Когда вы пишете скрипты для автоматизации, генерируете отчёты для начальства или просто пытаетесь понять, что за мусор выплюнула очередная утилита, printf даёт вам контроль над каждым символом. Это язык, на котором данные говорят с человеком понятно и красиво. И сегодня мы разберём эту команду до последнего винтика.
Синтаксис
Базовый шаблон команды выглядит так:
printf ФОРМАТ [АРГУМЕНТ...]Где ФОРМАТ — это строка, содержащая обычный текст и спецификаторы формата (начинающиеся с %), а АРГУМЕНТ — это данные, которые подставляются на место этих спецификаторов. В отличие от echo, printf не добавляет автоматический перевод строки, если вы явно его не укажете через \n. Это даёт вам полный контроль над выводом.
Основные опции
Самое интересное в printf — это не опции (их почти нет), а спецификаторы формата. Но есть и несколько полезных флагов:
| Опция | Описание | Пример |
|---|---|---|
-v ИМЯ | Сохраняет вывод не в stdout, а в переменную с указанным именем | printf -v msg "%s" "Привет" |
--help | Показывает краткую справку (если поддерживается) | printf --help |
--version | Выводит версию утилиты | printf --version |
Однако настоящая мощь printf — в спецификаторах формата. Вот самые важные из них:
| Спецификатор | Описание | Пример |
|---|---|---|
%s | Строка | printf "%s" "Hello" |
%d | Целое число (десятичное) | printf "%d" 42 |
%f | Число с плавающей точкой | printf "%f" 3.1415 |
%x | Шестнадцатеричное число (строчные буквы) | printf "%x" 255 |
%X | Шестнадцатеричное число (заглавные буквы) | printf "%X" 255 |
%o | Восьмеричное число | printf "%o" 8 |
%% | Выводит символ процента | printf "%%" |
\n | Перевод строки | printf "Первая строка\nВторая" |
\t | Табуляция | printf "Колонка1\tКолонка2" |
Каждый спецификатор можно дополнить модификаторами: ширина поля (например, %10s), точность для чисел с плавающей точкой (%.2f), выравнивание (%-10s) и другие. Это позволяет формовать данные с хирургической точностью.
Примеры использования
Форматирование отчёта с выравниванием
Представьте, что вы пишете скрипт для мониторинга состояния паровых котлов. Вам нужно вывести таблицу с именами сервисов, их статусом и временем работы. printf справится с этой задачей лучше, чем любой другой инструмент:
#!/bin/bash
# Паровой отчёт по сервисам
printf "%-20s %-10s %8s\n" "СЕРВИС" "СТАТУС" "ВРЕМЯ"
printf "%-20s %-10s %8s\n" "-------------------" "----------" "--------"
printf "%-20s %-10s %8d\n" "boiler.service" "активен" 3600
printf "%-20s %-10s %8d\n" "pump.service" "остановлен" 0
printf "%-20s %-10s %8d\n" "valve.service" "активен" 7200Вывод будет выглядеть как идеально выверенная таблица из механического журнала:
СЕРВИС СТАТУС ВРЕМЯ
------------------- ---------- --------
boiler.service активен 3600
pump.service остановлен 0
valve.service активен 7200Здесь %-20s означает строку шириной 20 символов с выравниванием влево, %8d — целое число шириной 8 символов с выравниванием вправо. Идеально для панелей управления!
Генерация строки с плавающей точкой для логов
Допустим, вы измеряете температуру в паровом цилиндре с помощью датчика, который выдаёт сырое значение вроде 123.456789. В логах вам нужна аккуратная запись с двумя знаками после запятой:
#!/bin/bash
TEMP_RAW=123.456789
printf "[%(%Y-%m-%d %H:%M:%S)T] Температура: %.2f°C\n" -1 $TEMP_RAWЧто здесь происходит? %(%Y-%m-%d %H:%M:%S)T — это магия printf в bash, которая подставляет текущее время в заданном формате (ключ -1 означает «сейчас»). А %.2f округляет число до двух знаков после запятой. В логе появится строка:
[2026-08-11 14:35:22] Температура: 123.46°CЧисто, информативно, никакого лишнего пара.
Динамический индикатор прогресса
Одна из самых эффектных возможностей printf — обновление одной и той же строки с помощью символа возврата каретки \r. Это позволяет создать индикатор прогресса, который не засоряет консоль сотнями строк:
#!/bin/bash
for i in {1..100}; do
printf "\rПрогресс: %3d%%" $i
sleep 0.1
done
printf "\nГотово!\n"Строка с процентом будет обновляться на месте, создавая иллюзию анимированного индикатора. Это работает потому, что \r возвращает курсор в начало строки, а следующий printf перезаписывает её. Идеально для долгих процессов — например, когда паровой двигатель разогревается до рабочей температуры.
💡 Совет
Создайте в своём .bashrc функцию-обёртку для printf, которая автоматически добавляет временную метку к каждому сообщению:
log() {
printf "[%(%Y-%m-%d %H:%M:%S)T] %s\n" -1 "$*"
}Теперь вместо echo "Что-то случилось" пишите log "Что-то случилось" — и в логе всегда будет точное время события. Ваши будущие “я” и коллеги скажут вам спасибо, когда будут разбираться, в какой момент паровой клапан дал течь.
⚡ Важно
Если вам нужно вывести символ процента %, не забудьте написать %%. Иначе printf решит, что вы начали спецификатор формата, и выдаст ошибку. Это частая ловушка для новичков:
# Неправильно — вызовет ошибку
printf "Скидка 50%\n"
# Правильно
printf "Скидка 50%%\n"Запомните это правило, и ваш паровой двигатель никогда не заклинит на ровном месте.
⚙️ Машинное отделение ROADIT благодарит за прочтение.
Больше команд, шпаргалок и обзоров — на roadit.ru и в нашем Телеграф-канале.
📋 Все команды