
Какую работу нужно написать?
Использование шаблона в качестве условия
Как было отмечено выше, в инструкции 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 используется в качестве ссылки на отдельное поле записи.