Поставь все на конвейер! 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] - любой символ из диапазона символов ^ - начало строки $ - конец строки \ - экранирует символы специального назначения (^.[$()|*+?{\) |