Язык 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 с другими языками программирования

Литература

  1. Aho, A. A. The AWK Programming Language / A. A. Aho, B. W. Kernighan, P. J. Weinberger. — Bell Telephone Laboratories, 1988.
  2. Robbins, A. Effective AWK Programming / A. Robbins. — O'Reilly, 2001.


КатегорияЯзыкиПрограммирования