Язык AWK
Язык AWK был спроектирован сотрудниками Bell Labs как инструменты для работы с текстом. Есть в большинстве дистрибутивов линукс. Само название AWK является аббревиатурой фамилий его разработчиков Alfred Aho, Peter Weinberger, и Brian Kernighan.
Содержание
Основы языка
AWK как и ЯзыкSed ориентирован на построчную обработку текста. AWK может быть как частью конвейера, так и работать c файлами. Файл трактуется как набор записей(records). В свою очередь запись состоит из последовательности полей(fields). По умолчанию в AWK строка рассматривается как запись, тогда первое слово в строке будет первым полем, второе -- вторым и т.д. Доступ к полям производится с помощью специальных переменных, начинающихся со знака $. Например:
$ echo 'Hello, World!' | awk '{ print $2 }' World!
$ echo 'Hello, World!' | awk '{ i = 1; print $i }' Hello,
Для доступа ко всей записи используется нулевое поле.
$ echo 'Hello, World!' | awk '{ print $0 }' Hello, World!
$ cat file.csv | sed -n '2 { p; }' | awk -F'\t' 'END { print NF; }'
Структура программы на AWK выглядит следующим образом:
шаблон { действие }
AWK сканирует входной поток на наличие шаблонов, в случае совпадения выполняются указанные действия. Как шаблон так и действие могут отсутствовать, но не одновременно. При отсутствии шаблона действие применяется ко всем строкам. Если отсутствует действие, то каждая строка содержащая шаблон просто печатается.
В AWK существуют 2 специальных шаблона - BEGIN и END. Действие, описанное для шаблона BEGIN выполняется до обработки первой записи, действие для шаблона END выполняется после обработки последней записи. Например:
$ echo -e "1\n2\n3" | awk 'BEGIN {a = 0} {a += $1} END {printf("total sum is %d\n", a)}' total sum is 6
На самом деле в примере выше блок с BEGIN лишний так как любая неинициализированная переменная содержит 0.
Переменные
По умолчанию разделителем полей в AWK является пробел или символ табуляции. Переопределить разделитель полей можно с помощью переменной FS (field separator)
$ cat /etc/passwd | awk 'BEGIN{FS = ":"} NR==1 {print $1, $7}' root /bin/bash
AWK и Sed
Сравнение AWK с другими языками программирования
Литература
- Aho, A. A. The AWK Programming Language / A. A. Aho, B. W. Kernighan, P. J. Weinberger. — Bell Telephone Laboratories, 1988.
- Robbins, A. Effective AWK Programming / A. Robbins. — O'Reilly, 2001.
КатегорияЯзыкиПрограммирования