AWK

Поделись знанием:
(перенаправлено с «Awk»)
Перейти к: навигация, поиск
AWK
Класс языка:

скриптовый, процедурный, событийно-ориентированный

Появился в:

1977

Автор:

Альфред Ахо, Питер Вайнбергер и Брайан Керниган

Выпуск:

[www.opengroup.org/onlinepubs/000095399/utilities/awk.html 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

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

Название AWK складывается из инициалов разработчиков языка: Alfred V. Aho, Peter J. Weinberger и 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)
 }

Напишите отзыв о статье "AWK"

Ссылки

  • [www.math.spbu.ru/user/rus/cluster/Doc/Library/awk_baluev/awk_bal_oglav.shtml Эффективное программирование на языке AWK. Руководство пользователя для GNU Awk] Версия 1.0.4, апрель 1999. Arnold D. Robbins, перевод Балуева А. Н.  (рус.)
  • [lib.ru/MAN/DEMOS210/awk.txt Язык обработки структурированных текстов AWK]  (рус.)
  • [www.lissyara.su/?id=1077 Документация]  (рус.)
  • [www.gnu.org/software/gawk/gawk.html GAWK (GNU Awk)]  (англ.)
  • [gnuwin32.sourceforge.net/packages/gawk.htm Gawk for Windows]  (англ.)
  • [www.catonmat.net/blog/awk-nawk-and-gawk-cheat-sheet/ Awk, Nawk and GNU Awk Cheat Sheet]  (англ.)
  • [opennet.ru/man.shtml?topic=awk&category=1 Интерактивная система просмотра системных руководств (man-ов)]  (рус.)
  • [citforum.ru/operating_systems/unixuser/gl10_1.shtml awk — язык сканирования и обработки текста] из [citforum.ru/operating_systems/unixuser/index.shtml Операционная система UNIX (руководство пользователя)]

Отрывок, характеризующий AWK

И он с теми свободными и фамильярными, грациозными движениями, которые его отличали, взял за руку фрейлину, поцеловал ее и, поцеловав, помахал фрейлинскою рукой, развалившись на креслах и глядя в сторону.
– Attendez [Подождите], – сказала Анна Павловна, соображая. – Я нынче же поговорю Lise (la femme du jeune Болконский). [с Лизой (женой молодого Болконского).] И, может быть, это уладится. Ce sera dans votre famille, que je ferai mon apprentissage de vieille fille. [Я в вашем семействе начну обучаться ремеслу старой девки.]


Гостиная Анны Павловны начала понемногу наполняться. Приехала высшая знать Петербурга, люди самые разнородные по возрастам и характерам, но одинаковые по обществу, в каком все жили; приехала дочь князя Василия, красавица Элен, заехавшая за отцом, чтобы с ним вместе ехать на праздник посланника. Она была в шифре и бальном платье. Приехала и известная, как la femme la plus seduisante de Petersbourg [самая обворожительная женщина в Петербурге,], молодая, маленькая княгиня Болконская, прошлую зиму вышедшая замуж и теперь не выезжавшая в большой свет по причине своей беременности, но ездившая еще на небольшие вечера. Приехал князь Ипполит, сын князя Василия, с Мортемаром, которого он представил; приехал и аббат Морио и многие другие.
– Вы не видали еще? или: – вы не знакомы с ma tante [с моей тетушкой]? – говорила Анна Павловна приезжавшим гостям и весьма серьезно подводила их к маленькой старушке в высоких бантах, выплывшей из другой комнаты, как скоро стали приезжать гости, называла их по имени, медленно переводя глаза с гостя на ma tante [тетушку], и потом отходила.
Все гости совершали обряд приветствования никому неизвестной, никому неинтересной и ненужной тетушки. Анна Павловна с грустным, торжественным участием следила за их приветствиями, молчаливо одобряя их. Ma tante каждому говорила в одних и тех же выражениях о его здоровье, о своем здоровье и о здоровье ее величества, которое нынче было, слава Богу, лучше. Все подходившие, из приличия не выказывая поспешности, с чувством облегчения исполненной тяжелой обязанности отходили от старушки, чтобы уж весь вечер ни разу не подойти к ней.
Молодая княгиня Болконская приехала с работой в шитом золотом бархатном мешке. Ее хорошенькая, с чуть черневшимися усиками верхняя губка была коротка по зубам, но тем милее она открывалась и тем еще милее вытягивалась иногда и опускалась на нижнюю. Как это всегда бывает у вполне привлекательных женщин, недостаток ее – короткость губы и полуоткрытый рот – казались ее особенною, собственно ее красотой. Всем было весело смотреть на эту, полную здоровья и живости, хорошенькую будущую мать, так легко переносившую свое положение. Старикам и скучающим, мрачным молодым людям, смотревшим на нее, казалось, что они сами делаются похожи на нее, побыв и поговорив несколько времени с ней. Кто говорил с ней и видел при каждом слове ее светлую улыбочку и блестящие белые зубы, которые виднелись беспрестанно, тот думал, что он особенно нынче любезен. И это думал каждый.
Маленькая княгиня, переваливаясь, маленькими быстрыми шажками обошла стол с рабочею сумочкою на руке и, весело оправляя платье, села на диван, около серебряного самовара, как будто всё, что она ни делала, было part de plaisir [развлечением] для нее и для всех ее окружавших.
– J'ai apporte mon ouvrage [Я захватила работу], – сказала она, развертывая свой ридикюль и обращаясь ко всем вместе.
– Смотрите, Annette, ne me jouez pas un mauvais tour, – обратилась она к хозяйке. – Vous m'avez ecrit, que c'etait une toute petite soiree; voyez, comme je suis attifee. [Не сыграйте со мной дурной шутки; вы мне писали, что у вас совсем маленький вечер. Видите, как я одета дурно.]
И она развела руками, чтобы показать свое, в кружевах, серенькое изящное платье, немного ниже грудей опоясанное широкою лентой.
– Soyez tranquille, Lise, vous serez toujours la plus jolie [Будьте спокойны, вы всё будете лучше всех], – отвечала Анна Павловна.
– Vous savez, mon mari m'abandonne, – продолжала она тем же тоном, обращаясь к генералу, – il va se faire tuer. Dites moi, pourquoi cette vilaine guerre, [Вы знаете, мой муж покидает меня. Идет на смерть. Скажите, зачем эта гадкая война,] – сказала она князю Василию и, не дожидаясь ответа, обратилась к дочери князя Василия, к красивой Элен.
– Quelle delicieuse personne, que cette petite princesse! [Что за прелестная особа эта маленькая княгиня!] – сказал князь Василий тихо Анне Павловне.
Вскоре после маленькой княгини вошел массивный, толстый молодой человек с стриженою головой, в очках, светлых панталонах по тогдашней моде, с высоким жабо и в коричневом фраке. Этот толстый молодой человек был незаконный сын знаменитого Екатерининского вельможи, графа Безухого, умиравшего теперь в Москве. Он нигде не служил еще, только что приехал из за границы, где он воспитывался, и был в первый раз в обществе. Анна Павловна приветствовала его поклоном, относящимся к людям самой низшей иерархии в ее салоне. Но, несмотря на это низшее по своему сорту приветствие, при виде вошедшего Пьера в лице Анны Павловны изобразилось беспокойство и страх, подобный тому, который выражается при виде чего нибудь слишком огромного и несвойственного месту. Хотя, действительно, Пьер был несколько больше других мужчин в комнате, но этот страх мог относиться только к тому умному и вместе робкому, наблюдательному и естественному взгляду, отличавшему его от всех в этой гостиной.