$ awk '$1=="L. Tansley" {print substr($1,1,5))' grade.txt
L. Tan
Эта команда возвращает из строки "L. Tansley" подстроку, начинающуюся с первого символа и занимающую пять символов.
Если значение третьего аргумента значительно превышает реальную длину строки, функция substr () возвращает все символы строки, начиная с указанной позиции:
$ awk '$1=="L. Tansley" {print substr ($1,3, 99) ) ' grade.txt
Tansley
То же самое происходит, когда третий аргумент вообще не указан. Например, следующая команда формирует список фамилий учеников:
$ awk '{print substr($1,3)}' grade.txt
Tansley
Lulu
Bunny
Troll
Tansley
Передача строк из интерпретатора shell утилите awk
Очень часто утилита awk получает входные данные не из файла, а по каналу от других команд. Рассмотрим несколько примеров обработки строк, поступающих из канала.
В первом примере команда echo передает строку "Stand‑by" утилите awk, которая вычисляет ее длину:
$ echo "Stand‑by" | awk '{print length($0)}'
8
Во втором примере утилита awk получает строку с именем файла и возвращает имя файла без расширения:
$ echo "mydoc.txt" | awk '{print substr($STR,1,5)}'
mydoc
Следующая команда возвращает только расширение файла:
$ echo "mydoc.txt" | awk '{print substr($STR,7)}'
txt
9.2.11. Escape–последовательности
При работе со строками и регулярными выражениями нередки случаи включения в шаблон поиска непечатаемых символов (таких как символ новой строки либо табуляции) или же символов со специальным значением в утилите awk (любой из метасимволов). Такие символы создаются с помощью управляющих Escape–последовательностей, признаком которых является обратная косая черта в начале.
Например, шаблон поиска открывающей фигурной скобки выглядит так:
/\|/
В табл. 9.5 перечислены Escape–последовательности, распознаваемые утилитой awk.
Таблица 9.5. Escape–последовательности утилиты awk
| \b | Возврат на одну позицию (забой) |
| \f | Прокрутка страницы |
| \n | Новая строка |
| \r | Возврат каретки |
| \t | Горизонтальная табуляция |
| \ddd | Восьмеричный код символа |
| \c | Любой другой специальный символ. Например, запись \\ соответствует символу обратной косой черты |
В следующей команде сначала отображается фраза "May Day", в которой слова разделены символом табуляции, а затем выводятся два символа новой строки, вследствие чего образуется пустая строка. Потом отображается слово "May", а за ним -cлово "Day", каждая буква которого представлена ASCII–кодом: 'D' — 104, 'а'- 141,'у'- 171.
$ awk BEGIN {print "May\tDay\n\nMay \104\141\171"}'
May Day
May Day
9.2.12. Команда printf
Во всех примерах, с которыми мы ознакомились, данные выводились на экран с помощью команды print без какого‑либо форматирования. В awk имеется намного более мощная команда printf, аналог одноименной функции языка С, позволяющая задавать правила форматирования выходных данных.
Базовый синтаксис команды таков:
printf "строка_формaтирования", аргументы
Строка форматирования может включать как литеральные символы, записываемые в выходной поток без изменения, так и спецификаторы форматирования (табл. 9.6), каждый из которых задает способ интерпретации соответствующего ему аргумента.
Таблица 9.6. Спецификаторы форматирования
| %c | Символ ASCI I; если аргумент является строкой, выводится первый символ строки |
| %d, %i | Целое число |
| %e | Число с плавающей точкой в формате [-]d.dddddde[+-]dd |
| %E | Аналогичен спецификатору %e, но знак экспоненты представлен символом 'E', а не 'e' |
| %f | Число с плавающей точкой в формате [~}ddd.dddddd |
| %G | Тип преобразования будет %e или %f в зависимости от того, какой результат короче; вывод незначащих нулей подавляется Аналогичен спецификатору %g, но экспоненциальный формат будет представлен спецификатором %E, а не %e . |
| %o | Восьмеричное число без знака |
| %s | Строка символов |
| %x | Шестнадцатеричное число без знака (используются шестнадцатеричные |
| цифры а, b, с, d, e, f) | |
| Аналогичен спецификатору %x, но используются шестнадцатеричные | |
| цифры А, В, С, D, E, F | |
| %% | Отображается символ '%', интерпретации аргумента не происходит |