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 (руководство пользователя)
Некоторые внешние ссылки в этой статье ведут на сайты, занесённые в спам-лист |