Цель работы: на основе ранее полученных навыков работы с командным интерпретатором BASH овладеть начальными навыками программирования на языке создания фильтров GAWK.
Теоретические сведения
Программируя в Shell, иногда не хватает имеющихся средств стандартных команд и средств перенаправления данных для создания гибких условий поиска и обработки полученных результатов. Требуются принципиально новые условия создания запросов и новые средства обработки информации. Нам уже известно, что стандартными фильтрами для создания и обработки запросов являются такие команды как cat, sort, find, grep, egrep, frep, cmp, diff и некоторые другие. Однако их возможности ограничены либо работой самой команды, либо работой в составе опций. Что же делать, если требуется создать более гибкие условия поиска и обработки информации в Linux? На этот счет можно воспользоваться встроенной в Linux программной средой GAWK и ее предшественником AWK.
При форматировании отчетов и извлечении информации из больших текстовых файлов неоценимую помощь нам оказывает утилита gawk, снабженная мощными средствами обработки текста. Основная задача утилиты gawk состоит в просмотре текстового файла или строки с целью нахождения в них информации, соответствующей заданному критерию отбора. Утилита имеет собственный язык программирования, поэтому ее можно назвать программируемым фильтром, настроенным на выполнение конкретной задачи. Фактически gawk выполняет две функции. С одной стороны, это фильтр, который можно вызвать из командной строки так же, как и любой другой фильтр. С другой стороны, gawk — это среда программирования, с помощью которой можно создавать другие фильтры.
Фильтры, создаваемые с применением языка программирования gawk, могут использоваться в среде любого интерпретатора Linux, в том числе shell, BASH и TCSH. Их задача заключается в считывании информации из источника данных, например текстового файла или стандартного потока ввода, изменении и анализе считанного, сохранении выходных данных. Результатом работы gawk, как правило, являются отредактированные входные данные. Вы можете дать ему указание считывать данные из файла, сортировать их в алфавитном порядке либо по номерам строк и направлять строки текста в выходной поток, как это делает фильтр sort, либо, подобно фильтру wc, считывать информацию из файла, подсчитывать количество слов и строк в тексте, а затем отображать полученные результаты. С помощью gawk вы можете выполнить поиск в файле информации, соответствующей заданному шаблону, после чего вывести найденные строки, то есть выполнять функции, присущие утилите фильтрации grep.
Язык программирования gawk позволяет пользователю не только разрабатывать собственные фильтры, но и создавать команды Linux. С его помощью можно отображать строки вводимого текстового файла на экране (как в случае применения команды cat), выполнять поиск информации в файлах в соответствии с заданными шаблонами (как при использовании утилиты grep) и даже подсчитывать, сколько раз встречается определенное слово в текстовом файле (возможности фильтра wc). В каждом из указанных случаев пользователь может добавить собственные функции, обеспечивающие фильтрацию, например, задать отображение лишь части каждой строки, выполнение поиска по шаблону в указанном поле или подсчет слов, набранных только прописными буквами. Подобная гибкость дает возможность использовать gawk для создания отчетов, поиска заданных текстовых фрагментов и выполнения вычислений на основе вводимых данных.
Утилиту gawk можно вызвать непосредственно из командной строки или из shell-сценария с помощью ключевого слова gawk. Такой сценарий часто рассматривают как новый фильтр. Фактически с помощью gawk вы можете определять собственные фильтры. В этом случае реализуются обе функции утилиты — и как фильтра, и как среды программирования. И обе они будут рассмотрены в настоящей главе: сначала мы изучим все возможности gawk как фильтра, а затем рассмотрим, как с ее помощью можно настроить свои фильтры.
Утилита gawk обладает гибким и сложным языком программирования и поддерживает команды, которые позволяют анализировать текст и выполнять расчеты. Можно также объявлять переменные и использовать их для управления процессом обработки строк. Многие операторы взяты из языка программирования С и имеют такой же синтаксис. Все это делает gawk очень мощным инструментом. Утилита gawk — это GNU-версия UNIX-утилиты awk, которая создавалась как стандартная утилита ОС UNIX (одним из ее создателей является Брайен Керниган, разработавший UNIX). Впоследствии была выпущена расширенная версия awk — nawk, предназначенная для обработки файлов. С помощью nawk можно обращаться к нескольким файлам в одной программе. Утилита gawk представляет следующий этап развития awk; в ней реализованы как возможности nawk, так и стандартные средства awk.
Команда gawk принимает в качестве аргументов инструкцию фильтра и список имен файлов. Инструкция заключается в одинарные кавычки и рассматривается как один аргумент. Она состоит из двух сегментов: шаблона и кода, задающего действие. Команды, определяющие действие, заключаются в фигурные скобки. Шаблонная часть уточняет, когда следует выполнять действие либо по отношению к каким входным данным оно должно производиться. Термин «шаблон» может ввести вас в заблуждение. Вероятно, более точно было бы назвать его условием. В утилите gawk имеется целый набор операций для построения сложных условий. Поиск по шаблону можно рассматривать как условие поиска записей. Вместо простого сопоставления с шаблоном, как в случае с grep, пользователь задает условие. Записи, которые удовлетворяют этому условию, выбираются, и к ним применяются действия, указанные в соответствующем сегменте. Синтаксис инструкции таков: шаблон {действие}
Утилита gawk получает данные либо из файлов, либо со стандартного устройства ввода. Имена файлов можно указать в командной строке после инструкции. Если таковые не указаны, то входные данные берутся со стандартного устройства ввода. Вызов этой утилиты состоит из ключевого слова gawk, инструкции и имен файлов. Как и в фильтре sed, инструкция помещается в одинарные кавычки, чтобы shell ее не интерпретировал. Поскольку условие и действие рассматриваются утилитой gawk как единый аргумент, их нужно заключить в одну пару кавычек. Синтаксис команды gawk показан в следующем примере.
$ gawk ‘шаблон {действие}’ имена_файлов
Шаблон в инструкции можно рассматривать как прототип строки в файле. Указанное действие выполняется над этой строкой. В следующих двух примерах на экран выводятся все строки, содержащие слово Penguin. В сегменте «шаблон» необходимо задать поиск по шаблону, для чего шаблон выделяется символами косой черты. Выбираться будут все записи с этим шаблоном. Сегмент «действие» в первом примере содержит команду print, которая направляет строку на стандартное устройство вывода.
books