Поиск по сайту:

Как использовать printf в Bash


Форматирование текста — интересная тема, особенно когда речь идет о Bash. Хотя существует множество инструментов для форматирования текста, printf уникален и универсален. Узнайте все о printf в Bash, чтобы правильно отформатировать текст!

Использование printf в Bash

C++ и другие разработчики уже знакомы с printf как с отличным способом форматирования вывода текста при программировании. Иметь такой же инструмент в Bash очень полезно. printf позволяет вам контролировать и создавать сложные форматы вывода именно так, как вы этого хотите. На справочной странице printf printf определяется как инструмент «форматирования и печати данных», чем он и занимается.

Например, вы хотите напечатать десятичное число с точной длиной 3 байта (или символов/чисел) для целочисленной части (часть до десятичной точки или запятой, в зависимости от того, в какой части мира вы живете и каковы ваши локаль есть) и 2 байта (или символы/цифры) для десятичной части числа? Нет проблем, printf может это и многое другое. Он также может выводить текст в определенный столбец на экране и т. д.

Хотя синтаксис printf для нового разработчика может показаться запутанным или сложным, на самом деле он довольно прост. Существует лишь ограниченный набор часто используемых символов форматирования, которые можно использовать в определении вывода printf. Давайте сначала посмотрим на них.

Синтаксис: printf

Это наиболее часто используемые идиомы форматирования чисел с синтаксисом printf:

%d or %i  a signed decimal integer
%u        an unsigned decimal integer
%f        a decimal floating point number
%e        a scientific notation number
%g        will let printf use %e or %f, whichever is shorter
%c        a single character
%s        a string of characters
%%        a literal '%'

Далее, полезно знать, как указать определенные параметры в связи с этими идиомами форматирования. Формат указания опций для них следующий:

%[flag(s)][width][.precision][length]number_formatting_idiom

Примеры: printf

Так, например, чтобы иметь float с шириной 3 и точностью 2, вы должны указать:

%3.2f

Давайте посмотрим на пример:

printf "%3.2fn" "100.304" 

Прямо и легко. Обратите внимание, что мы могли бы использовать переменную вместо \100.304\:

VAR1=100.304
printf "%3.2fn" ${VAR1}

Обратите также внимание, как мы добавили новую строку, используя последовательность новой строки n. Полный список доступных интерпретируемых последовательностей см. в разделе man printf. Наиболее распространенными являются n для новой строки, t для табуляции и \ для обратной косой черты.

В приведенном выше формате опций мы также видели, как мы можем указывать флаги. Существует ограниченное количество общих флагов:

-   Left-justify text (right-justify is the default)
+   Forces the use of a sign, even if positive
' ' A space is inserted if no sign will be used
0   Left-pad the number with zeroes instead of spaces when padding is specified

Так, например, мы можем иметь:

VAR1=-100.304
VAR2=100.304
printf "% 3.2ftt%+3.2fn" ${VAR1} ${VAR2}

Здесь мы использовали две переменные и разделили вывод двумя табуляциями, используя две последовательности табуляции t. Мы также вставили пробел (в качестве флага) между % и определением ширины. Это привело к тому, что отрицательное число в VAR1 печаталось с использованием отрицательного знака. Если бы число было положительным, знак не печатался бы, а вместо этого на том же месте печатался бы пробел.

Наконец, мы использовали флаг +, и действительно, наше число выводится с начальным знаком +, независимо от того факта, что число уже положительное и, следовательно, (обычно) никакого знака не будет. напечатано.

Итак, как мы можем убедиться, что у нас есть ведущие нули или пробелы, но при этом иметь определенную длину? Во-первых, мы должны убедиться, что ширина нашего определения больше, чем содержимое переменной, а во-вторых, мы можем использовать флаг 0, чтобы показать ведущие нули:

VAR1=-100.304
VAR2=100.304
printf "% 13.2fn%013.2fn%13.2f" ${VAR1} ${VAR2} ${VAR1}

В этом примере мы печатаем 3 строки, разделенные два раза последовательностью новой строки n. Мы сразу отмечаем, что если в конце вывода нет новой строки, наша подсказка Bash возвращается именно в конце нашей 3-й строки вывода.

Это может быть нехороший или удобный формат в интерактивном режиме в терминале, но внутри скрипта (подумайте, например, о такой последовательности, как 1...2...3..., которая создает шаг за шагом на экране по мере выполнения кода) это может быть очень удобно.

Во второй строке вывода мы используем флаг 0, чтобы указать, что мы хотели бы использовать ведущие нули для VAR2. Вывод действительно дает начальные нули до определенной длины.

В первой строке вывода мы вставили пробел, тогда как в третьей строке вывода (оба печатают переменную VAR1) мы этого не сделали. Вывод такой же, и это единственная странность, которую я обнаружил при работе с printf; можно было бы ожидать, что будет один дополнительный символ, учитывая определение флага пробела printf. Это остается прежним, даже если мы будем использовать начальные нули. Он также остается прежним, если длина не указана.

Таким образом, в некоторых случаях (отрицательные числа) использование флага пробела может быть ограничено. Это не относится к положительным числам:

VAR1=100.304
printf "% fn%0fn" ${VAR1} ${VAR1}

В этом случае (положительные числа) флаг пробела работает должным образом, и в случае первого вывода VAR1 вставляется дополнительный пробел.

Заключение

Использование printf из скриптов Bash или из командной строки может дать четкий и четкий вывод. Если вы правильно масштабируете переменные (и, возможно, проверяете их диапазон для уверенности), использование printf даст вам гибкий метод форматирования вывода (и общего макета экрана для больших приложений) по вашему выбору.

В этой статье мы рассмотрим часто используемые идиомы форматирования чисел, как определить ширину как целой, так и десятичной части чисел, а также рассмотрим наиболее часто используемые флаги в printf. Наслаждайтесь печатью хорошо отформатированных данных с помощью printf!