AWK сканирует input (стандартный ввод или указываемый набор файлов) и над строками, удовлетворяющими заданному образцу, выполняет указываемые д-я
Формат:
awk [-Fc] [-f file] [files] awk [-Fc] [prog] [files] prog - программа вида: 'образец ${$ действие $}$' file - файл с AWK-программой: образец { действие } образец { действие } files - файлы, предназначенные для AWK обработки -Fc - устанавливает разделитель полей в `с`
1. Язык программирования AWK допускает использование:
2. Образец:
3. Действие
Предложения
Каждая сканируемая строка input рассматривается как состоящая из полей, разделенных разделителями, по умолчанию пробел
На поля можно ссылаться:
Строка может содержать до 100 полей
Могут интерпретироваться как числовые или строковые, принимают значение в зависимости от контекста
Ссылки на поля могут интерпретироваться как переменные
# первое поле принимает значение второго, увеличенное на 3 $1 = "3" + $2 # поле, номер которого зависит от переменной i $(i + 1) # # Массивы не объявляются, значения принимаются из контекста # элементу массива Х, по индексу NR, присваивается обрабатываемая строка x[NR] = $0 # элементы могут индексироваться не только числами x["apple"]
В целом допускается все что и в sed
Из дополнительного:
/Olga/ - Указывает на строки, содержащие Olga. /[Oo]lga|[Mm]ike|[Mm]al/ - Указывает на строки, содержащие Olga или olga или Mike или mike или Mal или mal. /number[0-9]/ - Указывает на строки, содержащие number0 или number1 или ... number9. /\/.+\// - Указывает на строки, содержащие любое количество символов, больше или равное 1, заключенных в / /.
Принадлежность либо логическая операция
~ - Содержится; !~ - Не содержится. Лог. Операция: < , < =, ==, !=, > =, > .
Допускается логическая комбинация образцов (или, и, не (спец символами))
Комбинация «образец1 , образец2» означает начало и конец фрагмента
/02\.95/ & & ($1 !~ /\.su/ $2 !~ /\.su/) - Указывает на строки, содержащие 02.95 и не имеющие .su одновременно в первом и во втором поле. NR == 100, NR == 200 - Указывает строки с номерами от 100 до 200.
Образец BEGIN указывает на начало input или на те д-я которые должны быть выполнены до какого либо анализа строк
Образец END указывает на конец input или на д-я после обработки всех строк
BEGIN {FS = ":"} - Устанавливает разделитель полей в ":" до начала обработки строк. Эквивалентно опции "-F:" при AWK вызове. END { print NR } - Печатает номер последней строки input, т.е. количество обработанных входных строк.
PRINT [< список выражений >] [< <выражение1> ] # Если в списке выражения находятся через запятую, то значения этих выражений печатаются через символ разделитель OFS (по уолчанию пробел) # Если же выражения через пробел, то на печати происходит их конкатенация # Значение < выражение 1 > рассматривается как имя файла, его присутствие означает печатать в файл, можно использовать несколько файлов # Форматрованный вывод PRINTF формат [, список выражений ] [ > выражение1 ] # формат - символьная строка в войных кавычках, идентичен printf в C
Оператор присваивания имеет вид:
< переменная> = < выражение> Начальное значение переменной 0 или `` '' (пробел). Допускаются другие типы присваивания в соответствии с языком ``С'': "+=","-=","*=","/=","%=". < переменная> ++, ++< переменная> - увеличение значения переменной на 1. < переменная> --, --< переменная> - уменьшение значения переменной на 1.
Переменные не объявляются, сразу используются
Типизация слабо учитывается, конвертируется в число при первой арифметической операции,
в строку при первой конкатенации или пробеле
# Печать длинны самой длинной строки { if (length($0) > max) max = length($0) } END { print max } # Печать строк номера которых кратны трем { if (FNR % 3 == 0) print $0 } # Печать остатка найденной строки { # поиск начала 4-го поля... match($0,/[ \t]*[^ \t]*[ \t]*[^ \t]*[ \t]*[^ \t]*[ \t]*/) # ...печать остатка входной строки с найденной позиции print substr($0,1+RLENGTH) } # # # # #