AWK — си-подобный сценарный язык построчного разбора и обработки входного потока (например, текстового файла) по заданным шаблонам (регулярным выражениям). Может использоваться в сценариях командной строки.
AWK | |
---|---|
Класс языка | скриптовый, процедурный, управляемый данными |
Появился в | 1977 |
Автор | Альфред Ахо, Питер Вайнбергер и Брайан Керниган |
Разработчик | Альфред Ахо, Брайан Керниган и Питер Вайнбергер[вд] |
Выпуск | POSIX.1-2017 |
Система типов | нет |
Основные реализации | awk, GNU Awk, mawk, nawk, MKS AWK, Thompson AWK (компилятор), Awka (компилятор) |
Диалекты | old awk oawk 1977, new awk nawk 1985, GNU Awk gawk |
Испытал влияние | C, SNOBOL4, Bourne shell |
Повлиял на | Perl, Korn Shell (ksh93, dtksh, tksh), Lua |
Медиафайлы на Викискладе |
Название AWK складывается из первых букв фамилий разработчиков языка — Ахо, Уайнбергера (англ. Peter J. Weinberger) и Кернигана. Первая версия была написана в 1977 году в AT&T Bell Laboratories.
Структура программы
правитьAWK рассматривает входной поток как список записей. Каждая запись делится на поля. На основе этой информации выполняется некоторый определённый программистом алгоритм обработки. По умолчанию разделителем записей является символ новой строки (то есть записи — это то же самое, что строки), разделителем полей — символ пробела или табуляции, или последовательность таких символов. Символы-разделители можно явно определить в программе. Символ-разделитель полей можно определить и в командной строке.
AWK-программа состоит из операторов (правил), имеющих вид:
шаблон {действие}
шаблон {действие}
…
Каждая запись поочерёдно сравнивается со всеми шаблонами, и каждый раз, когда она соответствует шаблону, выполняется указанное действие. Если шаблон не указан, то действие выполняется для любой записи. Если не указано действие, то запись выводится. В AWK также существует 2 предопределённых шаблона BEGIN и END. BEGIN выполняется до начала обработки входного потока. END — после обработки последней записи входного потока.
Действие может состоять из последовательности операторов, разделяемых точкой с запятой, переводом строки или закрывающей скобкой.
Конструкции языка
правитьУсловия
правитьif(условие)
{
Список действий 1
}
else
{
Список действий 2
}
Циклы
правитьdo
правитьdo{
Тело цикла
}while (условие)
while
правитьwhile(условие){
Тело цикла
}
for (индексная форма)
правитьЦикл for в форме, ориентированной на обработку индексных массивов, имеет вид:
for(секция инициализации;секция условия;секция обновления итератора){
Тело цикла
}
Пример реализации:
for (i=1; i<=NF; i++)
words[tolower($i)]++
for (ассоциативная форма)
правитьЦикл for в форме, ориентированной на обработку ассоциативных массивов, имеет вид:
for(итератор in массив){
Тело цикла
}
Встроенные переменные
правитьПеременная | Содержание | Значение по умолчанию |
---|---|---|
ARGC | Число аргументов командной строки | - |
ARGV | Массив аргументов командной строки | - |
ENVIRON | Массив, содержащий переменные окружения | - |
FILENAME | Обрабатываемый входной файл | - |
FNR | Номер записи в текущем файле | - |
FS | Разделитель полей записи на вводе | пробел(ы) и/или табуляция |
NF | Число полей в текущей записи | - |
NR | Номер записи (общее число считанных записей) | - |
OFMT | Формат распечатки чисел | %.6g |
OFS | Разделитель полей записи на выводе (символ) | пробел(ы) и/или табуляция |
ORS | Разделитель записей на выводе AWK-программы (символ) | \0 |
RS | Разделитель записей на вводе (символ) | \0 |
RSTART | Позиция начала подстроки, найденной функцией match
|
- |
RLENGTH | Длина подстроки, найденной функцией match
|
- |
SUBSEP | Разделитель индексов в многомерных массивах | \034 |
Примеры
правитьBEGIN{print "Hello World!"; exit}
Печать длины самой длинной строки:
{ if (length($0) > max) max = length($0) }
END { print max }
Печать всех строк длиннее 80 символов:
{ if (length($0) > 80) print $0 }
Печать всех строк, имеющих хотя бы одно поле:
NF > 0
Печать количества строк в файле:
END { print NR }
Печать строк, номера которых кратны 3:
{ if (FNR%3==0) print $0 }
Печать остатка входной строки, следующего за первыми тремя полями:
{
# поиск начала 4-го поля...
match($0,/[ \t]*[^ \t]*[ \t]*[^ \t]*[ \t]*[^ \t]*[ \t]*/)
# ...печать остатка входной строки с найденной позиции
print substr($0,1+RLENGTH)
}
Ссылки
править- Эффективное программирование на языке AWK. Руководство пользователя для GNU Awk Версия 1.0.4, апрель 1999. Arnold D. Robbins, перевод Балуева А. Н. (рус.)
- [lib.ru/MAN/DEMOS210/awk.txt Язык обработки структурированных текстов AWK] (рус.)
- Документация (рус.)
- GAWK (GNU Awk) (англ.)
- Gawk for Windows (англ.)
- Awk, Nawk and GNU Awk Cheat Sheet (англ.)
- Интерактивная система просмотра системных руководств (man-ов) (рус.)
- awk — язык сканирования и обработки текста из Операционная система UNIX (руководство пользователя)
Некоторые внешние ссылки в этой статье ведут на сайты, занесённые в спам-лист |