Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #73, ЯНВАРЬ 2005 г.

Поставь все на конвейер!

j1m (j1m@list.ru)

Хакер, номер #073, стр. 073-100-4


$ cat /etc/passwd | awk 'BEGIN { FS=":" } /boris/ { print $3, $6 }'

Этот пример аналогичен предыдущему. При введении новых переменных в awk-программу объявлять их не нужно, они будут создаваться при инициализации. Причем переменная сама примет необходимый тип в зависимости от операций, выполняемых над ней:

$ awk 'BEGIN { a = 13 + 17; print a }'

$ awk 'BEGIN { a = "UN" "IX"; print a }'

По окончании выполнения первой команды на экран будет выведено число 30, а вторая команда выведет слово «UNIX». Конкатенация (слияние) строк выполняется операцией «пробел». Арифметические операции такие же, как в языке C. Массивы могут быть ассоциативными (как хэши в perl), то есть запись вида circle[color] = red; воспринимается интерпретатором нормально.

В awk присутствуют все стандартные управляющие операторы, такие как ветвления и циклы. В большинстве своем они повторяют операторы языка C. Вот только не знаю, как часто тебе придется ими пользоваться. При работе с текстом они редко бывают нужны.

Напоследок рассмотрим пример:

$ cat file | awk '

length > 72 {

printf("%s %d %s\n", "Строка", NR, "длинная.");

long++;

next;

}

{

printf("%s %d %s\n", "Строка", NR, "короткая.");

short++;

}

END {

printf("%s %d\n", "Всего длинных строк:", long);

printf("%s %d\n", "Всего коротких строк:", short);

}'

Это маленькая программа подсчитывает количество длинных и коротких строк в файле. Как ты уже, наверное, заметил, она состоит из трех блоков шаблон-действие. В первом блоке выясняется, длиннее ли строка 72-х символов (по умолчанию length вызывается с параметром $0). Если результат положительный, выводится сообщение и увеличивается счетчик (переменная long). Далее следует обратить внимание на оператор next, который принуждает интерпретатор перейти к обработке следующей строки. Таким образом, действие второго блока будет выполнено только в случае невыполнения действия первого блока. Последний блок END будет выполнен в самом конце и выведет общее количество коротких и длинных строк.

Некоторые встроенные функции awk

lenght(s) - возвращает длину строки s

index(s1, s2) - возвращает позицию вхождения строки s2 в строке s1

substr(s, i, n) - возвращает подстроку в n символов подстроки s, начиная с i

split(s, arr, sep) - разбивает строку s на основе разделителя sep и помещает результат в массив arr

system(c) - выполняет внешнюю команду s и возвращает код возврата

printf(format, a1, a2, ...) - выводит данные в соответствии с форматом printf(3)

toupper(str) - переводит копию строки str в верхний регистр

tolower(str) - переводит копию строки str в нижний регистр

cos(x) - возвращает косинус x

sin(x) - возвращает синус x

sqrt(x) - возвращает квадратный корень x

Регулярные выражения стандарта POSIX

Атомы (может быть любым неспециальным символом):

. - любой символ, кроме символа новой строки

[...] - любой символ из списка

[^...] - любой символ, кроме символов из списка

[n-m] - любой символ из диапазона символов

^ - начало строки

$ - конец строки

\ - экранирует символы специального назначения (^.[$()|*+?{\)

Назад на стр. 073-100-3  Содержание  Вперед на стр. 073-100-5