В состав спецификаторов форматирования могут входить различные модификаторы, определяющие дополнительные особенности форматирования (табл. 9.7). Модификатор помещается между символом '%' и управляющим символом.
Таблица 9.7. Дополнительные модификаторы
| - | Аргумент выравнивается по левому краю поля вывода (по умолчанию принято правостороннее выравнивание) |
| пробел | Если аргумент является положительным числом, перед ним ставится |
| пробел, а если отрицательным — знак минус | |
| + | Если аргумент является числом, ему всегда предшествует знак плюс, |
| даже если это положительное число | |
| # | Выбирается альтернативная форма спецификатора: |
| %о — восьмеричному числу предшествует ведущий ноль; | |
| %x — шестнадцатеричному числу предшествует запись 0x; | |
| %x — шестнадцатеричному числу предшествует запись Оx; | |
| %e, %E, %f — число всегда содержит десятичную точку; | |
| %g, %G — вывод незначащих нулей не подавляется | |
| 0 | Если длина поля вывода больше, чем число символов в представлении |
| аргумента, аргумент дополняется нулями, а не пробелами | |
| ширина | Ширина поля вывода; если длина поля больше, чем число символов |
| в представлении аргумента, аргумент по умолчанию дополняется | |
| пробелами | |
| . точность | Точность представления аргумента: |
| %е, %е, %f — число символов после десятичной точки; | |
| %g, %g — максимальное число значащих цифр; | |
| %d, %o, %i, %u, %x, %X — минимальное число выводимых цифр; | |
| % s — максимальное число выводимых символов |
Преобразование символов
Чтобы узнать, ASCII–код какого символа равен 65, можно с помощью команды echo направить строку "65" утилите awk и затем передать ее в качестве аргумента команде printf со спецификатором %с. Команда printf выполнит преобразование автоматически:
$ echo "65" | awk '{printf "%c\n", $0}'
A
Как видите, это символ 'A'. Обратите внимание на наличие в команде символа новой строки (\n). Необходимость в нем объясняется тем, что команда printf по умолчанию не записывает этот символ в выходной поток. Если не указать Escape–последовательность \n, сразу после буквы 'А' в той же строке будет отображено приглашение интерпретатора shell, что может смутить пользователя, работающего в данный момент за терминалом.
Конечно, код символа может быть указан непосредственно в команде printf:
$ awk 'BEGIN {printf "%c\n", 65}'
A
Форматированный вывод
Предположим, необходимо отобразить имена учеников и их идентификаторы, причем имена должны быть выровнены по левому краю и размещаться в поле длиной 15 символов. В конце строки форматирования стоит символ новой строки (\n(,
служащий для разделения записей. Выводимые данные будут размещаться в двух колонках:
$ awk '{printf "%-l5s %d\n", $1, $3}' grade.txt
M. Tansley 48311
J. Lulu 48311
P. Bunny 4 8
J. Troll 4842
L. Tansley 4712
9.2.13. Передача переменных утилите awk
Переменные можно создавать не только в сценарии awk, но и непосредственно в командной строке. Формат вызова утилиты awk в этом случае таков:
awk 'сценарий' переменная=значение входной_файл
В следующем примере переменная AGE создается в командной строке и инициализируется значением 10. Показанная команда находит студентов, возраст которых не превышает 10 лет.
$ awk '{if($5 < AGE) print $0}' AGE=10 grade.txt
M. Tansley 05/99 48311 Green 8 40 44
J. Lulu 06/99 48317 green 9 24 26
Рассмотрим более сложный пример. Системная команда df отображает информацию о смонтированных файловых системах. Результаты ее работы по умолчанию имеют следующий формат:
| Имя | Число блоков . | Занято блоков | Свободно блоков | Процент | Точка монтирования | |
| файловой системы | занятых | |||||
| блоков | ||||||
| Столбец | 1 | 2 | 3 | 4 | 5 | 6 |
Чтобы узнать, в какой из имеющихся файловых систем объем свободного пространства ниже критической отметки, следует передать выходные данные команды df утилите awk и последовательно сравнить значения в четвертом столбце с пороговым значением. В следующей командной строке пороговое число задано в виде переменной TRIGGER, которая равна 56000: