WikiSort.ru - Программирование

ПОИСК ПО САЙТУ | о проекте
AWK
Класс языка скриптовый, процедурный, управляемый данными
Появился в 1977
Автор Альфред Ахо, Питер Вайнбергер и Брайан Керниган
Разработчик Альфред Ахо
Выпуск IEEE Std 1003.1-2004 (POSIX) / 1985
Система типов нет
Основные реализации: 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
Сайт github.com/onetrueawk/awk

AWK — C-подобный скриптовый язык построчного разбора и обработки входного потока (например, текстового файла) по заданным шаблонам (регулярным выражениям). Может использоваться в сценариях командной строки.

Название AWK складывается из инициалов разработчиков языка: Alfred V. Aho, Peter J. Weinberger[en] и Brian W. Kernighan. Первая версия AWK была написана в 1977 году в AT&T Bell Laboratories.

Структура программы

AWK рассматривает входной поток как список записей. Каждая запись делится на поля. На основе этой информации выполняется некоторый определённый программистом алгоритм обработки. По умолчанию разделителем записей является символ новой строки (то есть записи — это то же самое, что строки), разделителем полей — символ пробела или табуляции, или последовательность таких символов. Символы-разделители можно явно определить в программе. Символ-разделитель полей можно определить и в командной строке.

AWK-программа состоит из операторов (правил), имеющих вид:

шаблон {действие}
шаблон {действие}
. . .

Каждая запись поочерёдно сравнивается со всеми шаблонами, и каждый раз, когда она соответствует шаблону, выполняется указанное действие. Если шаблон не указан, то действие выполняется для любой записи. Если не указано действие, то запись выводится. В AWK также существует 2 предопределённых шаблона BEGIN и END. BEGIN выполняется до начала обработки входного потока. END — после обработки последней записи входного потока.

Действие может состоять из последовательности операторов, разделяемой точкой с запятой, переводом строки или закрывающей скобкой.

Конструкции языка

Условия

if(условие)
then
  {
   Список действий 1
  }
else
  {
   Список действий 2
  }

Циклы

do

do{
    Тело цикла
}while (условие)

while

while(условие){
    Тело цикла
}

for (индексная форма)

Цикл for в форме, ориентированной на обработку индексных массивов, имеет вид:

for(секция инициализации;секция условия;секция обновления итератора){
    Тело цикла
}

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

Встроенные функции

Примеры

«Hello world!»

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)
}

Ссылки

Данная страница на сайте WikiSort.ru содержит текст со страницы сайта "Википедия".

Если Вы хотите её отредактировать, то можете сделать это на странице редактирования в Википедии.

Если сделанные Вами правки не будут кем-нибудь удалены, то через несколько дней они появятся на сайте WikiSort.ru .




Текст в блоке "Читать" взят с сайта "Википедия" и доступен по лицензии Creative Commons Attribution-ShareAlike; в отдельных случаях могут действовать дополнительные условия.

Другой контент может иметь иную лицензию. Перед использованием материалов сайта WikiSort.ru внимательно изучите правила лицензирования конкретных элементов наполнения сайта.

2019-2024
WikiSort.ru - проект по пересортировке и дополнению контента Википедии