Поиск по сайту:
Ах, если бы могли видеть жизнь, а не ситуацию! (Ежи Лец).

Использование команды Bash printf для печати форматированных выходных данных

16.11.2020
Bash Heredoc

Самый простой способ печати из командной строки Linux – использовать команду echo.

echo "Value of var is $var"

 

Однако команда echo не подойдет, если вам нужно распечатать форматированный вывод.

Здесь вам поможет команда printf. Команда printf в bash работает как команда printf в языке программирования C/C ++.

printf "Моей собаки %s %d лет.\n" Бобик 9

 

Первый аргумент %sожидает строку, %dожидает десятичное целое число, как в C/C ++. Не волнуйтесь, если вы не знакомы с C/C ++.

Вам не нужно изучать его только для использования команды printf в ваших сценариях Bash. Позвольте мне показать вам несколько примеров команды printf в Bash.

 

Использование команды printf в Bash

Начнем сначала с синтаксиса.

printf format [arguments]

 

Здесь format- строка, которая определяет, как будут отображаться последующие значения.

В этом примере printf “Моей собаки %s %d лет.\n” Бобик 9, «Моей собаки %s %d лет. \n» – это формат, за которым следуют аргументы Бобик и 9. Аргументы используются для замены спецификаторов формата (% s,% d и т. д.), Которые мы объясним позже в этой статье.

В простейшей форме printf можно использовать как команду echo для отображения строки.

printf "Hello World\n"

 

Обратите внимание на символ новой строки \n в конце? Разница между командами echo и PRINTF является то, что echo автоматически добавляет символ новой строки в конце, но для Printf, вы должны явно добавить.

 

Обратите особое внимание на тип и количество аргументов

Имейте в виду, что строка формата пытается применяться ко всем аргументам. Поэтому на него стоит обратить особое внимание.

Maximus@andreyex:~$ printf "Привет, %s! \n" Maximus Бобик
Привет, Maximus! 
Привет, Бобик!

 

Читать  Как использовать команду readarray для чтения 2D-массива в Bash

Точно так же вы должны обратить внимание на тип спецификатора формата, который он ожидает в строке формата.

Как вы можете видеть в приведенном выше примере, если он не находит нужные аргументы, он отображает значения по умолчанию, которые равны нулю для строк и 0 для целых чисел.

printf "Привет %s, ваша будка номер %d. \n" Maximus Бобик 131
bash: printf: Бобик: invalid number
Привет Maximus, ваша будка номер 0. 
Привет 131, ваша будка номер 0.

 

Здесь он принимает Maximus Бобик как первый набор аргументов, так и 131 второй набор аргументов.

Когда он находит строку (Бобик) вместо целого числа, он жалуется, но продолжает отображать вывод со вторым аргументом со значением по умолчанию 0.

Точно так же он видит 131 как строку во втором наборе аргументов, а поскольку второй аргумент отсутствует, по умолчанию он равен 0.

 

Символы спецификации формата

Для отображения вывода в желаемом формате доступно несколько спецификаторов формата. Вот некоторые из самых распространенных:

символПрименение
%sСтрока
%cОдиночный персонаж
%dЦелые числа
%oВосьмеричные целые числа
%xШестнадцатеричные целые числа
%fПлавающая точка
%bСтрока с escape-символом обратной косой черты
%%Знак процента

 

Теперь, когда вы знакомы со спецификатором формата, давайте рассмотрим еще несколько примеров, демонстрирующих их в действии.

 

Примеры команды printf в bash

Мы не думаем, что вам нужно подробное объяснение большинства этих примеров, поскольку они не требуют пояснений.

Maximus@andreyex:~$ printf "Восьмеричное значение %d is %o\n" 30 30
Восьмеричное значение 30 is 36

 

Давайте посмотрим, как использовать спецификатор %b для правильной интерпретации экранированного символа обратной косой черты.

Maximus@andreyex:~$ printf "Строка с обратной косой чертой: %s\n" "Hello\nWorld!"
Строка с обратной косой чертой: Hello\nWorld!

 

Читать  Сеанс сохранения экрана GNU при перезагрузке

Как видите %s, это не имеет значения. Но %b с новой строкой escape-символ будет правильно интерпретирован:

Maximus@andreyex:~$ printf "Строка с обратной косой чертой: %b\n" "Hello\nWorld!"
Строка с обратной косой чертой: Hello
World!

 

Когда вы используете %c, он читает только символ за раз.

Maximus@andreyex:~$ printf "Символ: %c\n" a
Символ: a
Maximus@andreyex:~$ printf "Символ: %c\n" a b c
Символ: a
Символ: b
Символ: c
Maximus@andreyex:~$ printf "Символ: %c\n" abc
Символ: a

 

Использование модификаторов для отображения вывода printf в определенном стиле

Есть модификаторы, чтобы изменить внешний вид вывода по своему вкусу.

 

# модификатор для восьмеричных и шестнадцатеричных чисел

Ранее вы видели использование %oдля преобразования десятичного числа в восьмеричное. Однако было не совсем ясно, что это восьмеричное число. Вы можете использовать #модификатор для отображения восьмеричных и шестнадцатеричных чисел в правильном формате.

Maximus@andreyex:~$ printf "%d is %#o в восьмеричном и %#x в шестнадцатеричном формате\n" 30 30 30
30 is 036 в восьмеричном и 0x1e в шестнадцатеричном формате

 

Модификатор пробела для положительных целых чисел

Вы можете использовать пробел между %и d внутри %d для отображения положительного целого числа с начальным пробелом. Это помогает, когда у вас есть столбец положительных и отрицательных чисел. Посмотрите, какой из них выглядит более симпатичнее:

Maximus@andreyex:~$ printf "%d \n%d \n%d \n" 10 -10 10
10 
-10 
10 
Maximus@andreyex:~$ printf "% d \n%d \n% d \n" 10 -10 10
 10 
-10 
 10 

 

Модификатор ширины

Модификатор ширины – это целое число, указывающее минимальную ширину поля аргумента.

По умолчанию он выровнен по правому краю:

Maximus@andreyex:~$ printf "%10s| %5d\n" Age 23
       Age|    23

 

Вы можете выровнять его по левому краю, добавив -к нему флаг:

Maximus@andreyex:~$ printf "%-10s| %-5d\n" Age 23
Age       | 23

 

Читать  10 полезных примеров команды Sort в Linux

Модификатор точности

Вы можете использовать прецизионный модификатор (.) Точки , чтобы определить минимальное количество цифр , которое будет отображаться с %d, %u, %o, %x. Он добавляет нулевое заполнение слева от значения.

Maximus@andreyex:~$ printf "Roll Number: %.5d\n" 23
Roll Number: 00023

 

Если вы используете модификатор точности со строкой, он указывает максимальную длину строки. Если строка длиннее, на дисплее она обрезается.

Maximus@andreyex:~$ printf "Имя: %.4s\n" Maximus
Имя: Alex

 

Вы можете комбинировать модификатор ширины и точности:

Maximus@andreyex:~$ printf "Имя: %.4s\n" Maximus
Имя: Alex
Maximus@andreyex:~$ printf "Имя: %10.4s\n" Maximus
Имя:       Alex

 

Бонусный пример: отображение вывода в табличном формате с помощью printf

Давайте применим то, что вы узнали о команде printf, на более сложном примере. Это продемонстрирует истинный потенциал команды printf в сценариях bash.

Давайте воспользуемся командой printf, чтобы распечатать следующую таблицу с помощью bash:

ИмяIDВозрастОценки
Sherlock Holmes000012223A
James Bond000000727F
Hercules Poirot000681159G
Jane Marple123456771C

 

Вот сценарий оболочки, который мы написали для этой задачи. Ваш сценарий может отличаться:

#/bin/bash
seperator=--------------------
seperator=$seperator$seperator
rows="%-15s| %.7d| %3d| %c\n"
TableWidth=37

printf "%-15s| %-7s| %.3s| %s\n" Name ID Age Grades
printf "%.${TableWidth}s\n" "$seperator"
printf "$rows" "Sherlock Holmes" 122 23 A
printf "$rows" "James Bond" 7 27 F
printf "$rows" "Hercules Poirot" 6811 59 G
printf "$rows" "Jane Marple" 1234567 71 C

 

Разве не чудесно использовать команду printf в bash для печати красиво отформатированного вывода для ваших сценариев?

Надеюсь, вам понравилось это подробное руководство по команде printf в Linux. Если у вас есть вопросы или предложения, дайте мне знать.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (1 оценок, среднее: 5,00 из 5)
Загрузка...
Поделиться в соц. сетях:


0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

**ссылки nofollow

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

Это может быть вам интересно


Рекомендуемое
Если вы посещали школу дизайна или интересовались психологией, возможно, вы…

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: