Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LINUX / ЛП_ieem_linux.doc
Скачиваний:
114
Добавлен:
27.03.2016
Размер:
1.94 Mб
Скачать

Форма предоставления отчета

Отчет должен содержать:

  1. название лабораторной работы и цели работы;

  2. краткие сведения по теоретической части;

  3. примеры назначения переменных, псевдонимов или примеры создания программ (элементов программ);

  4. Краткие ответы на контрольные вопросы;

  5. Выводы по работе.

МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ИНСТИТУТ ЭЛЕКТРОННОЙ ТЕХНИКИ (ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ)

«УТВЕРЖДАЮ»

ЗАВЕДУЮЩИЙ КАФЕРДОЙ ИЭМС

_______________ Ю.А.ЧАПЛЫГИН

«____»_____________ 2007 г.

ЛАБОРАТОРНАЯ РАБОТА № 6

ПО КУРСУ «ОПЕРАЦИОННАЯ СИСТЕМА LINUX»

Программирование в среде gawk

ОПИСАНИЕ СОСТАВИЛ:

КОЗЛОВ А.В.

МОСКВА 2007

Лабораторный практикум по курсу: “Операционная система Red Hat Linux

Лабораторная работа №6

Программирование в среде GAWK

Цель работы: на основе ранее полученных навыков работы с командным интерпретатором 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

Tempest Shakespeare 15.75 Penguin Christmas Dickens 3.50 Academic

Iliad Homer 10.25 Random

Raven Рое 2.50 Penguin

$gawk '/Penguin/{print}' books

Tempest Shakespeare 15.75 Penguin Raven Рое 2.50 Penguin

Во втором примере сегмента «действие» нет, поэтому применяется действие, задан­ное по умолчанию, то есть команда print.

$ gawk '/Penguin/' books

Tempest Shakespeare 15.75 Penguin Raven Рое 2.50 Penguin

Поиск по шаблону и специальные символы

Утилита gawk может выбирать строки, используя шаблон, который содержит спе­циальные символы. Сам шаблон обозначается двумя косыми и помещается в сегменте шаблона инструкции gawk.

/шаблон/ {действие}

Поиск по шаблону осуществляется во всех строках файла. Указанное действие вы­полняется по отношению к строке, в которой обнаруживается шаблон. В этом случае выполняемая gawk работа очень похожа на редактирование. Как и в sed, строка рас­сматривается в качестве строки текста, а поиск шаблона осуществляется во всей строке. В следующем примере gawk ищет строку с шаблоном Рое и, найдя таковую, выводит ее на экран.

$ gawk '/Рое/{print}' books

Raven Рое 2.50 Penguin

В gawk можно использовать те же специальные символы, что и в регулярных вы­ражениях, в фильтре sed и редакторе Ed. В первом из приведенных ниже примеров поиск шаблона выполняется в начале строки, обозначенном специальным символом А. Во втором примере поиск шаблона производится в конце строки, который обозначен спе­циальным символом $.

$ gawk '/"Christmas/{print}' books

Christmas Dickens 3.50 Academic

$ gawk '/Random*/{print}' books

Iliad Homer 10.25 Random

Как и в утилитах Ed и sed, в gawk с помощью специальных символов можно задавать разновидности шаблона: точка обозначает любой символ, звездочка — несколько эк­земпляров шаблона, а квадратные скобки — набор символов. В показанном ниже при­мере точка используется для поиска шаблона, в котором за одним произвольным сим­волом следуют символы «en».

$ gawk '/.en/{print}' books

Tempest Shakespeare 15.75 Penguin

Christmas Dickens 3.50 Academic

Raven Рое 2.50 Penguin

В следующем примере используются квадратные скобки и звездочка, то есть задается последовательность чисел. Набор возможных чисел определен диапазоном цифр в квадратных скобках, [0—9]. Звездочка обозначает любое количество экземпляров чисел. Заканчивается шаблон последовательностью символов .50. Совпадением считается лю­бое число, которое заканчивается указанными символами .50. Обратите внимание: перед точкой стоит обратная косая черта, благодаря чему программа рассматривает ее именно как точку, а не как специальный символ.

$ gawk '/[0-9]*\.50/ {print}' books

Christmas Dickens 3.50 Academic Raven Рое 2.50 Penguin

Кроме этого, в gawk используются специальные символы расширенного набора: +, ? и |. Символы + и ? — это варианты специального символа *. Символ + обозначает один или несколько экземпляров какого-либо символа, а ? — ни одного или один экземпляр символа. Символ | позволяет задать другие искомые шаблоны. В следующем примере пользователь ищет строку, содержащую либо шаблон Penguin, либо шаблон Academic.

$ gawk '/Penguin|Academic/ {print}' books

Tempest Shakespeare 15.75 Penguin Christmas Dickens 3.50 Academic

Raven Рое 2.50 Penguin

Переменные, операторы и массивы

В gawk поддерживаются определения переменных различных типов, массивов и стан­дартных арифметических операторов и операторов присваивания, которые существуют в большинстве языков программирования (в частности, в С). В состав gawk включены также условные операторы. Их мы рассмотрим чуть позже, в разделе «Управляющие структуры».

Переменные, константы и шаблоны

Утилита gawk позволяет определять переменные. Существует три типа переменных: переменные для обозначения полей, специальные переменные и пользовательские пе­ременные. Переменные для обозначения полей и специальные переменные утилита определяет автоматически. Пользователь может определять собственные переменные. Кроме того, можно определять арифметические и строковые константы. Арифметиче­ские константы состоят из цифр, а строковые — из любых символов, заключенных в двойные кавычки.

Поле — это любой набор символов, ограниченный разделителем полей. По умол­чанию в качестве разделителя используется пробел или знак табуляции. Как и другие фильтры, gawk нумерует поля, начиная с 1. Утилита определяет переменную для каждого поля файла. Имя переменной, обозначающей поле, состоит из знака $ и номера поля. Так, имя $2 указывает на второе поле. Переменная $0 — это специальная переменная, содержащая всю строку.

В следующем примере выводятся второе и четвертое поля файла books, именуемые $2 и $4.

books

Tempest Shakespeare 15.75 Penguin

Christmas Dickens 3.50 Academic

Iliad Homer 10.25 Random

Raven Рое 2.50 Penguin

$gawk '{print $2, $4}' books

Shakespeare Penguin Dickens Academic

Homer Random

Рое Penguin

Переменной можно присвоить значение с помощью операции присваивания =. Зна­чение может быть содержимым переменной (скажем, переменной, обозначающей поле), специальной переменной или пользовательской переменной. Оно может быть и кон­стантой (см. следующий раздел). В нашем примере пользователь присваивает перемен­ной myfield значение второго поля.

$ gawk ‘{myfield = $2; print myfield}' books

Shakespeare Dickens

Homer Рое

По умолчанию gawk разделяет поля символами пробела или табуляции. Однако вы можете определить собственные разделители, которые нужно явно задать посредством опции -F. Фактически при использовании этой опции устанавливается специальная переменная FS, выступающая в роли разделителя поля. В качестве разделителя можно указать любой символ.

Арифметические операторы и операторы присваивания

Язык gawk поддерживает полный набор арифметических операторов, обеспечиваю­щих выполнение операций сложения, вычитания, умножения, деления, а также деления с остатком. Арифметические операторы аналогичны операторам языка программиро­вания С. Все эти операторы, а также операторы присваивания перечислены в табл. 2.

В gawk существует возможность выполнять арифметические вычисления над значе­ниями, заданными числовыми шаблонами. Числовой шаблон представляет собой по­следовательность цифр. Примерами шаблона могут служить арифметическая константа или поле, содержимым которого являются числа. Арифметические константы, пере­менные полей, а также определяемые пользователем переменные, значения которых представляют числовые шаблоны, могут использоваться в качестве операндов арифме­тических операций. Существует также ряд встроенных числовых переменных gawk, на­пример NR, определяющая номер текущей записи, и NF, задающая количество полей в текущей записи. Такие переменные могут применяться и в качестве арифметических операндов.

Арифметические операции обычно вводятся в сегменте действия или шаблона ин­струкции gawk. В следующем примере выводятся все четные строки. Знак процента (%) представляет собой оператор деления по модулю, результатом выполнения которого является остаток от деления на число. Если остаток от деления номера строки на 2 равен нулю, значит, номер строки четный. Обратите внимание, каким образом скобки изменяют порядок выполнения операторов в выражении.

$ gawk '(NR % 2) ==0 {print NR, $0}' books

2 Cristmas Dickens 3.50 Academic {

4 Raven Рое 2.50 Penguin

Арифметические операторы и переменные позволяют выполнять вычисления над значениями полей таблиц, хранящихся в базе данных. Например, сумму значений в заданном столбце можно вычислить так, как это делается в электронной таблице. Рас­смотрим пример, в котором суммируются значения третьего столбца таблицы из файла books. Суммируемое значение присваивается переменной tot, определенной пользова-' телем. Для вывода на печать итогового значения tot используется специальный шаблон END. При этом считается, что значение переменной tot при инициализации автома­тически устанавливается равным 0.

$ gawk '{print; tot = tot + $3} END {print "Total=",tot}' books

Tempest Shakespeare 15.75 Penguin

Christmas Dickens 3.50 Academic

Iliad Homer 10.25 Random

Raven Рое 2.50 Penguin Total= 32

Наряду со стандартными арифметическими операторами в gawk применяются со­ставные арифметические операторы присваивания. Составные операторы представляют собой комбинацию арифметических операторов и операторов присваи­вания. Они используются для сокращенной записи операции присваивания, когда в переменной сохраняется результат вычисления выражения, в котором применяется эта же переменная. Например, операция tot = tot + 1 может записываться с помощью составного арифметического оператора += в виде tot += 1. В данном случае в арифме­тическом выражении переменную tot указывать не требуется, поскольку само применение составного арифметического оператора += уже предполагает ее наличие. Аналогичным образом, и оператор i = i * 2 может быть записан с применением составного арифме­тического оператора *= в виде i *= 2. Результат выполнения приведенной ниже ко­манды такой же, как и в предыдущем примере:

$ gawk '{print; tot += $3} END {print "Total=", tot)’ books

Массивы и ассоциативные массивы

В gawk к элементу массива обращаются, как и в обычных языках программирова­ния — с помощью индекса, заключенного в скобки и помещенного после имени масси­ва. Массив, подобно переменным, определяется после первого использования индекса. Однако в среде gawk, в отличие от некоторых языков программирования, объявлять массив и задавать его границы не требуется. В gawk массивы являются динамическими и их размерность увеличивается по мере добавления новых элементов.

В следующем примере объявляется массив titles, каждому элементу которого при­сваивается значение первого поля в строке. Этот массив может содержать произвольное количество элементов (в данном случае оно равно количеству строк). В качестве индекса массива используется переменная num, значение которой увеличивается на единицу после каждого обращения к элементу массива. По окончании вычисления на печать выводится последний элемент массива.

$ gawk ' (title» [num] - $1; num++} END {print title» [num -1]}' books Raven

Предположим, нам требуется присвоить значение каждому полю отдельной записи массива. Это можно реализовать с помощью обычных операторов присваивания, задавая нужное значение для каждого поля. Существует и более короткий путь решения зада­чи — использование функции split, которая разделяет строку символов на сегменты и помещает полученные сегменты в массив. Аргументами функции split являются входная строка символов, результирующий массив и символ-разделитель. Символ-раз­делитель представляет собой строку. Например, при использовании в качестве разде­лителя двоеточия будет задействована строка «>. Если символ-разделитель не указан, в качестве разделителя по умолчанию применяется символ пробела или табуляции.

Функцию split можно использовать и для обработки строковых значений. Напри­мер, функция split ("9-10-92" ,date,"-") присваивает значение 9 элементу массива date[l], значение 10 — элементу date[2], а значение 92 — элементу date[3]. В следующем примере значение каждого поля строки присваивается элементу массива myrec. Выбор присваиваемой строки осуществляется с помощью шаблона /Dickens/. Вывод полей производится в обратном порядке.

$ gawk '/Dickens/ (split($0, myrec); print myrec[4], myrec[3], myrec[2], myrec[1]}' books

Academic 3.50 Dickens Christmas

В gawk можно также определять ассоциативные массивы. В массивах такого типа в качестве индекса используются строковые значения. Предположим, вам требуется найти информацию об издательстве, опубликовавшем произведение некоего автора. В следующем примере названия издательств присваиваются элементам массива, в котором в качестве индекса используются имена авторов. Второе поле представляет собой имя автора, а четвертое — название издательства. В данном примере на печать выводится название издательства Dickens. Обратите внимание на двойные кавычки вокруг строки «Dickens». При использовании строковой константы в качестве индекса массива строку требуется заключать в двойные кавычки.

Использование шаблона в качестве условия

Как было отмечено выше, в инструкции gawk шаблоном может служить условная или составная управляющая конструкция либо регулярное выражение. В языках про­граммирования условные управляющие конструкции содержат выражения, принимаю­щие истинные либо ложные значения. Если результат проверки условия является ис­тинным, выполняются операторы управляющей конструкции. Шаблон утилиты gawk также может выступать в качестве условия проверки. Если результат сравнения с шабло­ном положителен, должно производиться действие, заданное в инструкции gawk. В этом смысле шаблон может рассматриваться как проверяемое условие, определяющее, какие действия должны выполняться.

В языках программирования условные управляющие конструкции могут быть дос­таточно сложными, включать по нескольку логических операторов и операторов срав­нения, а также арифметические выражения и даже вызовы функций. Подобно языкам программирования, шаблоны gawk также могут быть достаточно сложными и содержать подшаблоны, использующие логические и арифметические операторы, а также опера­торы сравнения. В этом смысле шаблон можно рассматривать как синоним термина «выражение». Однако тогда как используемые в языках программирования операнды представляют собой числа или строки, в шаблоне gawk операнды рассматриваются как образцы, с которыми производится сравнение. В gawk в ходе выполнения операции сравнения с шаблоном рассматривается некоторое значения. Логические операции вклю­чают подвыражения, которые и выполняют сравнение с шаблоном. Фактически на под­выражения ссылаются как на «шаблоны», а сложные логические операции будут име­новаться «составными шаблонами».

Равенство и операторы сравнения

Простые тестируемые выражения можно сформировать с помощью оператором про­верки на равенство значений, переменных полей и констант. Операторы проверки на равенство аналогичны подобным операторам языка программирования С. В gawk такой оператор обозначается двумя знаками равенства (==). Этим он отличается от подобного оператора в других языках программирования. Одиночный знак равенства обозначает оператор присваивания =. Поэтому нужно быть внимательным, используя эти опера­торы. Оператор проверки на неравенство обозначается восклицательным знаком, за которым следует знак равенства, !=. Применение указанных операторов демонстрирует следующий пример. Здесь на печать выводятся только те строки, в последних полях которых находится строка «Penguin». Обратите внимание, что в данном случае исполь­зуется не шаблон, выделяемый косыми, а строковая константа. Шаблон, выделяемый двумя косыми, представляет собой шаблон поиска, тогда как строка является обычным значением.

$ gawk '$4 == "Penguin" {print}' books

Tempest Shakespeare 15.75 Penguin Raven Рое 2.50 Penguin

Для формирования логических выражений, выполняющих проверку условий, можно применять также операторы сравнения. Утилита gawk использует те же операторы срав­нения, что и другие языки программирования: >, <, >= и <= (все они описаны в табл. 3). Однако в отличие от языка С, операторы сравнения gawk позволяют со­поставлять строковые значения. Сравнение производится в соответствии с алфавитом, поэтому строка «Aleina» будет «меньше» строки «Larisa». В следующем примере поль­зователь просматривает все книги, цена которых не превышает 10.00. Обратите вни­мание, что в качестве одного из операндов применяется числовая константа.

$ gawk '$3 > 10.00 {print}' books

Tempest Shakespeare 15.75 Penguin Iliad Homer 10.25 Random

Логические операции

В gawk существует множество логических операторов, которые могут применяться для проверки некоторых условий. Эти операторы аналогичны стандартным логическим операторам языка программирования С. Логический оператор AND обозначается двой­ным амперсандом &&, оператор OR — двумя вертикальными линиями ||, а оператор NOT — восклицательным знаком !. При работе с логическими операторами обычно применяются скобки. В следующем примере выполняется проверка значения четвертого поля записи, содержащей шаблон «Penguin», и значения третьего поля с числом 10.00. В результате выполнения операции сравнения формируется список книг стоимостью более 10.00, выпущенных издательством Penguin, который выводится на печать.

$ gawk '($4 == "Penguin") && ($3 > 10.00) {Print)' books

Tempest Shakespeare 15.75 Penguin

В следующем примере пользователь формирует список книг, выпущенных издатель­ствами Penguin и Academic. При создании списка строки «Penguin» и «Academic» срав­ниваются со значениями из четвертого поля текущей записи.

$ gawk '($4 = "Penguin") || ($4 == "Academic") {print}' books

Tempest Shakespeare 15.75 Penguin

Christmas Dickens 3.50 Academic

Raven Рое 2.50 Penguin

Поиск по шаблону

Специальные символы ~ и !~ применяются для выполнения поиска по шаблону в полях текущей записи. Вместо того чтобы посредством операции = сравнивать все поля с шаблоном, можно с помощью операции ~ проверить, присутствует ли конкретный шаблон в поле. При таком поиске в полях правый операнд — это шаблон, а левый — поле, в котором его нужно найти. В следующем примере в первом поле выполняется поиск шаблона «mas»:

$ gawk '($1 - /mas/) (print)' books

Christmas Dickens 3.50 Academic

А ниже представлен пример, где производится выборка всех записей, в первом поле которых шаблон «mas» отсутствует.

$ gawk r($l !- /mas/) {print}' books

Tempest Shakespeare 15.75 Penguin

Iliad Homer 10.25 Random Raven Рое 2.50 Penguin

Специальные символы можно использовать не только при общем поиске по шаб­лону, но и в случае поиска в полях. В приведенном ниже примере пользователь ищет в четвертом поле шаблон «Penguin», начинающийся со строчной или с прописной буквы. Специальный символ [] служит для определения последовательности символов, начи­нающейся с прописной и строчной букв Р.

$ gawk '($4 - /[Pp]enguin/) {print}' books

Tempest Shakespeare 15.75 Penguin Raven Рое 2.50 Penguin

Шаблоны BEGIN и END

В инструкции gawk можно использовать два специальных шаблона, что дает воз­можность пользователю указывать действия, которые должны выполняться до и после обработки строк. Ключевое слово BEGIN задает действия, подлежащие выполнению перед операцией обработки, a END — действия, подлежащие выполнению после таковой. В нашем следующем примере перед обработкой строк выводится заголовок «Book List», а после обработки — значение переменной NR. Поскольку значение NR увеличивается по мере обработки каждой строки на единицу, то после завершения процесса оно станет равным общему количеству записей в файле.

$ gawk 'BEGIN {print "Book List") {print} END{print "Total records is ",

NR}' books

Book List

Tempest Shakespeare 15.75 Penguin

Christmas Dickens 3.50 Academic

Iliad Homer 10.25 Random

Raven Рое 2.50 Penguin

Total records is 4

Файлы инструкций gawk

Инструкции по мере их усложнения лучше помещать в файл, который может читать gawk. Если вам когда-нибудь придется вносить в них изменения, то достаточно будет откорректировать этот файл. Читать инструкции из файла, а не из командной строки, gawk позволяет опция -f. В следующем примере инструкции для выдачи списка книг издательства Penguin помещаются в файл findbk. gawk, после чего вызывается инструкция gawk с опцией -f и именем файла findbk. gawk.

Управляющие конструкции

Синтаксис языка gawk напоминает синтаксис обычного языка программирования. С его помощью можно определять переменные, конструировать выражения и присваи­вать значения. Язык этой утилиты включает несколько управляющих структур, обес­печивающих повторное выполнение команд и выбор нужной команды или последова­тельности команд. Повторное выполнение команд (циклы) организуется с помощью структур while, for и for-in. Управляющая структура для выбора варианта одна, if. Все эти структуры, за исключением цикла for-in, очень похожи на соответствующие структуры языка про­граммирования С.

Цикл while

Цикл while начинается с ключевого слова while, за которым следует заключенное в скобки проверяемое условие. После проверяемого условия указываются действия, которые могут группироваться в блоки, заключенные в фигурные скобки. Каждое дей­ствие внутри блока выделяется точкой с запятой. Вот синтаксис цикла while:

while (условие) ( действия-gawk;

}

Каждая итерация цикла, как правило, выполняется в три этапа: инициализация цикла, проверка условия и приращение значения переменной цикла, которая исполь­зуется для управления таковым. В приведенном ниже файле threefields.gawk на печать выводятся три первых поля каждой записи. Для управления циклом используется пе­ременная i. На каждой итерации цикла значение этой переменной увеличивается на 1. Эта операция выполняется в блоке, заключенном в фигурные скобки. Затем значение переменной сравнивается с числом 3 и таким образом определяется момент завершения цикла. Значение переменной i используется в качестве ссылки на отдельное поле записи.

Цикл for

Цикл for используется для тех же целей, что и цикл while, но имеет другой синтаксис. За ключевым словом for здесь следуют три выражения, которые заключены в круглые скобки и разделены точкой с запятой.

tor{выражение 1; выражение2; выражениеЗ)

действия }

Первое выражение выполняется перед началом цикла. В нем обычно инициализи­руется переменная, используемая для управления циклом. Второе выражение является тестируемым выражением (проверяемым условием) и непосредственно управляет вы­полнением цикла. Третье выражение обычно выполняется на каждой итерации цикла и после его завершения. Как правило, в этом выражении изменяется значение пере­менной цикла. Далее указываются действия gawk, производимые на каждой итерации цикла, В качестве действия может применяться и блок действий, заключенных в фи­гурные скобки. Третье выражение — это, чаще всего, операция увеличения переменной цикла на единицу, которая производится после выполнения действия.

for{инициализация; тестируемое выражение; приращение) {

действие }

В следующем примере цикл for используется для вывода на печать первых трех полей файла field3for. Обратите внимание, насколько цикл for компактнее цикла while.

Цикл for-in

В предыдущих примерах в качестве индексов массива используются числовые пе­ременные. Однако применять их в качестве индексов ассоциативного массива нельзя. Ссылки на элементы ассоциативного массива задаются с помощью строковых пере­менных. Для обработки элементов ассоциативного массива язык gawk имеет специаль­ную циклическую управляющую конструкцию. Она также начинается с ключевого слова for; однако во всем остальном ее синтаксис отличается от синтаксиса обычного цикла for. В цикле for-in за ключевым словом for следует переменная, потом — ключевое слово in и имя массива. В ходе выполнения цикла переменной присваивается строковое значение, являющееся индексом массива. Использование в качестве индекса массива каких-либо переменных других типов здесь не допускается. Поэтому цикл for-in, предназначенный для обработки ассоциативных массивов, имеет ограниченное приме­нение. Синтаксис этого цикла приведен ниже:

for(переменная in имя-массива) {

действие }

В сценарии bkcount.gawk на печать последовательно выводятся обработанные эле­менты массива bookcnt. При обработке записей в качестве индекса массива bookcnt выступает четвертое поле записи, представляющее собой название издательства. На каждой итерации цикла for строковой переменной pubname последовательно присваиваются значения, являющиеся индексами массива bookcnt. На печать выводится не только эле­мент массива, но и текущий индекс.

bkcount.gawk

{bookcnt[54]= bookcnt[$4J + 1 }

END {

for(pubname in bookcnt) { print bookcnt[pubname], pubname;

} }

$gawk -f bkcount.gawk books

2 Penguin 1 Academic 1 Random

Управляющая структура if

Управляющая структура if языка gawk позволяет выполнить проверку условий. Син­таксис структуры if таков:

if(условие)

{ действие

}

Если заданное в структуре проверяемое условие истинно, выполняется действие, указанное далее. Если проверяемое условие ложно, действие игнорируется.

Структура if может содержать ключевое слово else, после которого указывается действие, подлежащее выполнению лишь в том случае, если проверяемое условие струк­туры if является ложным. В этом смысле структура if-else напоминает ветвящееся дерево: если условие истинно, выполняется переход на одну ветвь дерева, если ложно — на другую.

Теперь возвратимся к синтаксису структуры if-else. Обратите внимание на то, что после определения действия, заданного перед ключевым словом else, отсутствует точка с запятой. Этим структура if-else напоминает аналогичную структуру языка программирования С. Однако если в программе, написанной на С, вы нечаянно введете точку с запятой, появится сообщение об ошибке. В gawk точка с запятой является разделителем нескольких действий. В рассматриваемом примере сценария markup.gawk третье поле файла books содержит значение цены. Если цена превышает 10.00, она увеличивается на 10%; в противном случае цена увеличивается на 20%. Обратите вни­мание на отсутствие точки с запятой после определения действия, перед ключевым словом else.

markup.gawk

{

if($3 > 10.00)

$3 - $3 + (0.10 * $3 ) else

$3 = $3 + (0.20 + $3);

print SO }

Создание пользовательских фильтров с помощью gawk

С помощью gawk программист может создавать собственные фильтры, помещая всю инструкцию в сценарий shell. Этот файл затем можно сделать исполняемым, и его имя станет новой командой Linux. В сценарии инструкции gawk следует брать в кавычки. В файле сценария инструкцию нужно записывать так, как будто вы собираетесь вы­полнять ее из командной строки. Шаблон и действие можно записать в отдельных строках. Это значит, что первая строка gawk-операции будет начинаться с ключевого слова gawk, за которым будет следовать одинарная кавычка. Затем в отдельных строках можно указать шаблон и действие. После закрывающей одинарной кавычки в той же строке нужно указать имена файлов.

gawk ' образец {

действие; ) ' имена_файлов

В следующем примере пользователь поместил всю инструкцию gawk в файл сце­нария field3. Эта инструкция отображает первые три поля каждой строки и, что особенно важно, взята в кавычки. После установления для файла сценария права на выполнение (посредством команды chmod) данный файл можно выполнять как команду.

fiel(13

gawk ' (

for(1-1; (i<=3); i++;) {

printf("%s\t", $i); }

printf("\n") ; }' books

$chmod 755 field3 $ field3

Tempest Shakespeare 15.75

Christmas Dickens 3.50

Iliad Homer 10.25

Raven Рое 2.50

Соседние файлы в папке LINUX