НАЗВА
gawk - мова пошуку й обробки зразків
ЗВЕДЕННЯ
gawk [ опції POSIX або GNU ] -f програмнийфайл [ -- ] файл ...
gawk [ опції POSIX або GNU ] [ -- ] текстпрограми файл ...
pgawk [ опції POSIX або GNU ] -f програмнийфайл [ -- ] файл ...
pgawk [ опції POSIX або GNU ] [ -- ] текстпрограми файл ...
ОПИС
Gawk - це втілення GNU мови програмування AWK. Вона відповідає визначенню мови, даному Стандартом Мови Команд та Знарядь POSIX 1003.2. Цей стандарт, у свою чергу, заснований на книзі Ахо, Кернігана та Вейбергера "Мова програмування AWK" (The AWK Programming Language, Aho, Kernighan і Weinberger). Крім того, у gawk внесені деякі додаткові можливості, що з'явилися у версії awk для UNIX System V 4-го випуску. Підтримуються також пізніші розширення awk, запропоновані Лабораторіями Бел, а також деякі розширення GNU.
Pgawk є профільованою версією gawk. Вона схожа у всьому на gawk за винятком того, що програми виконуються повільніше, й автоматично створюють профілюючий файл виконання awkprof.out. Дивіться опцію --profile нижче.
Командний рядок складається з опцій самої gawk, AWK-тексту програми (якщо файл програми не вказано опціями -f або --file) і значень, що можуть бути надані вбудованим змінним ARGC і ARGV .
ФОРМАТ ОПЦІЙ
Опції gawk можна задати як у традиційному для POSIX однобуквеному форматі, так і у форматі довгих опцій GNU. Опції POSIX починаються з "-", тоді як довгі опції починаються з "--". Довгі опції надано для специфічних як для GNU можливостей, так і для стандартних можливостей POSIX.
Згідно зі стандартом POSIX, опції, специфічні для gawk, портібно вказати, як аргументи опції -W. Можна застосувати декілька опцій -W. Для кожної опції -W існує відповідна довга опція (дивіться нижче). Аргументи довгих опцій може бути приєднано знаком = (без пробілів) або наступним аргументом командного рядка. Довгі опції можна скорочувати за умови, що вони залишатимуться унікальними назвами.
ОПЦІЇ
Gawk розуміє наступі опції (у алфавітному порядку).
-F fs :
--field-separator fs : Використовувати fs, як розділювач полів (значення вбудованої змінної FS).
-v змінна=значення :
--assign змінна=значення : Перед виконанням програми присвоїти змінній вказане значення. Такі змінні доступні у блоці BEGIN програми AWK.
-f програмнийфайл_ :
--file програмнийфайл : Узяти текст програми з програмногофайла, замість з першого аргументу командного рядка. Може бути вказано кілька опцій -f (або --file).
-mf NNN :
-mr NNN : Встановити різні обмеження пам'яті для значення NNN. Прапорець f встановлює максимальну кількість полів, а r - максимальний розмір відрізку. Ці два прапорці й опцію -m було введено в дослідницькій версії UNIX awk від Лабораторій Бел. Вони ігноруються gawk, оскільки gawk не має попередньо встановлених обмежень.
-W compat :
-W traditional :
--compat :
--traditional : Працювати у режимі сумісності. У цьому режимі gawk працює як UNIX awk. Розширення GNU не підтримуються. Використанню --traditional надається перевага перед іншими формами цієї опції. Додаткову інформацію ви знайдете нижче у розділі РОЗШИРЕННЯ GNU.
-W copyleft :
-W copyright :
--copyleft :
--copyright : Вивести коротку інформацію про авторські права GNU та вийти.
-W dump-variables[=file] :
--dump-variables[=file] : Вивести відсортований список глобальних змінних, їхніх типів і останніх значень до файла file. Якщо назву файла не вказано, gawк створить awkvars.out у поточному каталозі. Список усіх змінних є хорошим способом знайти типографічні помилки у вашій програмі. Вам також хотілося би мати його у випадку великої програми з багатьма функціями для певності, що функції не використовують глобальних змінних там, де малися на увазі локальні.
-W exec file :
--exec file : Схожа до -f, за винятком того, що цю опцію буде оброблено останньою. Її слід використовувати з #! -сценаріями CGI, щоб запобігти передачі інших опцій або коду командного рядка з URL (однорідного локатору ресурсу). Ця опція також унеможливлює присвоєння з командного рядка значеннь змінним.
-W gen-po :
--gen-po : Сканує і аналізує програму AWK, створюючи стандартному виводі файл у форматі GNU .po із записами ланцюжків тексту, що можуть бути локалізованими у програмі. Сама програма не виконується. Дивіться дистрибуцію gettext GNU для додаткової інформації про файли .po.
-W help :
-W usage :
--help :
--usage : Виводить коротеньку довідку про опції і виходить з успішним статусом.
-W lint[=аргумент] :
--lint[=аргумент] : Виводить попередження про наявність сумнівних або несумісних з іншими втіленнями AWK конструкцій. Разом із необов'язковим аргументом fatal призводить до фатальної помилки. Це - можливо радикально, але його використання сприяє розробці чистішого коду AWK. Разом з необов'язковим аргументом invalid - виводяться попередження тільки про справді недопустимі речі.
-W lint-old :
--lint-old : Видає попередження про наявність конструкцій, несумісних зі старими версіями UNIX awk.
Вмикає режим сумісності з наступними обмеженнями:
-W posix :
--posix :
- Екрануючі послідовності \x не розпізнаються.
- Якщо значення FS складається з одного пробілу, то розділювачами вважаються тільки пробіл і символ табуляції. Символ нового рядка розділювачем не вважається.
- Ви не можете продовжувати рядки після ? та :.
- Синонім func ключового слова function - не розпізнається.
- Оператори і = замість ^ і ^= - не використовуються. .IP o Недоступна функція fflush().
-W profile[=file] :
--profile[=file] : Записує профілюючі дані до файла file. Без задання - awkprof.out. Коли використовується з gawk, профіль виглядатиме просто як "гарненько видрукуваний" програмний текст. Якщо використовується з pgawk, профіль включатме номер виконання кожного виразу з лівого боку і число викликів кожної означеної користувачем функції.
-W re-interval :
--re-interval : Дозволити використання інтервальних виразів у регулярних виразах. (дивіться Регулярні вирази нижче). Інтервальні вирази традиційно були відсутні у мові AWK. Стандарт POSIX вніс їх для сумісності awk із egrep. Проте їхнє використання може привести до збоїв у старих програмах AWK, тому gawk розпізнає їх тільки, якщо вказано цю опцію, або --posix.
-W source текстпрограми_ :
--source текстпрограми : Використає текстпрограми як джерельний код програми AWK. Ця опція дозволяє сполучати виклики бібліотечних функцій (підключаються через опції -f і --file) з вихідним кодом, уведеним на командному рядку. Ця опція призначена в першу чергу для середнього і великого розміру програм AWK, використовуваних у сценаріях оболонки.
-W version :
--version : Виводить інформацію про версію вашої копії gawk. Ця опція може бути корисною, якщо ви хочете довідатися, чи не застарів gawk, встановлений на вашій системі, а також, якщо ви хочете повідомити про помилку. (У відповідності зі Стандартами Кодування GNU, ці опції приводять до негайного виходу з успішним статусом.)
Це відповідає погодженню по обробці аргументів, яке використовується більшістю інших програм, сумісних зі стандартом POSIX.
-- : Сигналізує кінець опцій. Ця опція корисна тим, що дозволяє обробку подальших аргументів, які починаються з "-", самою програмою AWK. \" Ця опція використовується для можливості обробки аргументів,
У режимі сумісності всі інші опції вважаються недійсними й ігноруються. У звичайному режимі, якщо вказано текст програми, невідомі опції передаються програмі AWK через масив ARGV для обробки. Це особливо зручно для запуску програм за допомогою "#!".
ВИКОНАННЯ ПРОГРАМИ AWK
Програми AWK складаються з послідовності операторів зразок-дія і можливих визначень функцій.
шаблон { твердження дій }
functionназва(список параметрів) { твердження }
Спочатку gawk читає вихідний текст програми з програмногофайла(ів), якщо він наданий, з аргументів опції --source або з першого аргументу командного рядка, який не є опцією. Опції -f і --source можуть бути вказані на командному рядку декілька разів. Gawk сприймає текст програми так, начебто всі програмніфайли були зчеплені один з одним. Це зручно також для створення бібліотек функцій AWK, тому що не вимагає явного визначення функцій у кожній новій програмі, що використовує їх. Крім того, ця можливість дозволяє сполучати бібліотечні функції з програмами командного рядка.
Змінна оточення AWKPATH містить шлях, по якому відбувається пошук файлів, вказаних опцією -f. Якщо цієї змінної не існує, то типово, використовується шлях ".:/usr/local/share/awk". (Шлях може бути іншим, в залежності від того, як gawk було скомпільовано і встановлено.) Якщо назва файла, вказаного як аргумент опції -f, містить символ "/", то пошук не відбувається.
Gawk виконує програми у наступній послідовності: спершу відбувається ініціалізація змінних, вказаних опцією -v. Далі gawk компілює програму у внутрішній формат. Потім gawk виконує код у блоці (блоках) BEGIN, якщо такі існують, і починає читати файли, назви яких утримуються у масиві ARGV. Якщо на командному рядку не було вказано жодних файлів, то gawk читатиме зі стандартного потоку вводу.
Якщо назва файла на командному рядку має вигляд var=vall, то воно сприймається як операція присвоєння. Змінній var буде надано значення vall. (Це відбудеться одразу після виконання блоку (блоків) BEGIN.) Присвоювання значень змінним на командному рядку зручно для динамічної ініціалізації змінних, використовуваних AWK для визначення способу розподілу вхідного потоку на поля і відрізки. Крім того, воно придатне в тих випадках, коли потрібно обробити кілька разів той самий файл.
Якщо значення одного з елементів ARGV порожнє (""), gawk пропустить його.
Кожен відрізок вхідного потоку перевіряється gawk на предмет збігу з шаблонами. Для кожного шаблона, що збігся з текстом, виконується відповідна дія. Перевірка шаблонів відбувається у тому самому порядку, в якому вони зустрічаються у програмі.
Нарешті, після того, як весь вхідний потік оброблено, gawk виконує код блоку (блоків) END, якщо такі є.
ВІДРІЗКИ, ПОЛЯ І ЗМІННІ
У AWK використовуються динамічні змінні, тобто, вони з'являться при першому їх використанні. Значенням змінних можуть бути числа з рухомою точкою, ланцюжки, або і те і інше, в залежності від їхнього використання. AWK також підтримує одновимірні масиви. Багатовимірні масиви можна імітувати. Під час виконання програми встановлюється декілька вбудованих змінних. Їх буде описано по ходу, з сумарним зведенням в кінці.
Відрізки
Примітка: англійський термін record ми переклали як відрізок, чим насправді він і є.
Стандартно, відрізки (records) розділяються символами нового рядка. Ви можете визначити відмінний спосіб поділу відрізків, якщо надасте нове значення вбудованій змінній RS. Якщо значенням RS є один символ, то він буде використовуватися для поділу відрізків. У протилежному випадку RS перетворюється у регулярний вираз. Текст серед вхідного потоку, що збігся з цим виразом, буде розділяти окремі відрізки. У режимі сумісності, для поділу відрізків буде використовуватися лише перший символ значення RS. Якщо RS встановлено як порожній ланцюжок, то відрізки будуть розділятися порожніми рядками. У цьому випадку, символ нового рядка працюватиме як роздільник полів, на додаток до значення яке утримує FS.
Поля
Кожний відрізковий запис, що зчитується, gawk розбиває на поля, використовуючи значення змінної FS як розділювач. Якщо значенням FS є один символ, то поля поділятимуться цим символом. Якщо значенням FS є порожній ланцюжок, то кожний символ вважатиметься окремим полем. У протилежному випадку, FS вважається регулярним виразом. Виключенням є випадок, коли значення FS встановлене до одного пробілу. В такому разі, поля розділятимуться комбінаціями пробілів і/або символів табуляції, і/або символами нового рядка. (Але дивіться також інформацію з --posix нижче.) Зауважте: значення IGNORECASE (дивіться нижче) також впливає на те як відбувається поділ на поля, якщо FS є регулярним виразом, і на поділ відрізків, якщо RS є регулярним виразом.
Якщо змінна FIELDWIDTHS містить розділений пробілами список чисел, gawk вважатиме ширину кожного поля фіксованої довжини і розділятиме відрізки у відповідності зі вказаними сумарним числовим значенням. Значення змінної FS у цьому випадку ігнорується. Присвоювання нового значення змінній FS анулює використання FIELDWIDTHS і відновлює стандартне поводження.
На кожне поле вхідного відрізку можна посилатися за його позицією - $1, $2 і так далі. $0 означає весь відрізок. Будь-якому полю можна привласнити нове значення. Для посилань на поля необов'язково використовувати сталі. Наприклад:
n = 5
print $n
виведе п'яте поле відрізку. Змінна NF (number of fields) містить кількість полів вхідного відрізку.
Результатом посилання на відсутнє поле (тобто поле з номером, що перевищує $NF) буде порожній ланцюжок. Присвоєння значення відсутньому полю (наприклад, $(NF+2) = 5) збільшує значення NF і створює проміжні поля з порожніми ланцюжками як значення, обчислює заново $0 і використовує міст змінної OFS як розділювач полів. Посилання на поля з негативними номерами призведе до фатальної помилки. Зменшення значення NF викличе втрату значень полів з номерами, що перевищують нове значення. Значення $0 буде обчислене заново, поля розділятимуться вмістом змінної OFS .
Вбудовані змінні
Ось перелік вбудованих змінних gawk:
ARGC : Кількість аргументів командного рядка (окрім опцій gawk і назви файла вихідного тексту програми).
ARGIND : Індекс масиву ARGV, що вказує на оброблюваний у даний момент файл.
ARGV : Масив аргументів командного рядка. Індекс масиву може приймати значення від 0 до ARGC - 1. Змінюючи значення ARGV, можна контролювати, які файли оброблятимуться.
BINMODE : На несумісних з POSIX системах, вказує використання "бінарного" стану для всіх операцій вводу-виводу над файлами. Числові значення 1, 2 або 3 визначають чи це стосується вхідних файлів, файлів виводу чи всіх файлів, відповідно. Букви "r" (read) або "w" (write) також означають файли вводу або виводу, тоді як "rw" або "wr" - всі. Будь-яке інше значення розглядатиметься як "rw".
CONVFMT : Формат перетворення чисел. За узгодженням, " %.6g".
ENVIRON : Масив поточних значень змінних середовища. Масив індексовано назвами змінних, кожен елемент містячи значення відповідної змінної (наприклад, ENVIRON["HOME"] може мати значення /home/arnold). Зміна вмісту цього масиву не впливає на значення змінних оточення, як їх бачать програми, що запускаються gawk за допомогою перенаправлення або функції system().
ERRNO : Якщо виникла системна помилка під час перенаправлення для getline, під час читання для getline, або ж під час виклику close(), те ERRNO буде містити ланцюжок опису помилки. Це опис піддається перекладу у не-англійських локалях.
FIELDWIDTHS : Розділений пробілами, список довжин полів. Якщо цій змінній присвоюється нове значення, то gawk розділяє вхідні дані на поля фіксованої довжини, ігноруючи значення змінної FS.
FILENAME : Назва файла, який обробляється в дану мить. Якщо на командному рядку не було вказано жодного файла, то значення FILENAME дорівнюватиме "-". У блоці BEGIN змінну FILENAME не визначено (хіба встановити її за допомогою getline).
FNR : Номер поточного відрізку в поточному файлі вводу.
FS : Роздільник полів у вхідному потоці (field separator), без задання - пробіл. Дивіться розділ Поля вище.
IGNORECASE : Керує залежністю всіх регулярних виразів і ланцюжкових операцій від регістра. Якщо значення IGNORECASE не дорівнює нулеві, тоді регістр буде ігноровано у порівнюванню ланцюжків і регулярних виразах, у поділі на поля, використовуючи FS, у поділі на відрізки, використовуючи RS, у регулярних виразах з ~ і !~, у вбудованих функціях gensub(), gsub(), index(), match(), split() і sub().
Таким чином, якщо значення IGNORECASE не дорівнює нулеві, то /aB/ зійдеться з будь-яким ланцюжком з "ab", "a", "Ab" або "AB". Як і у решті змінних AWK, початкове значення IGNORECASE дорівнює 0, тож усі операції з ланцюжками і регулярними виразами, за звичайних обставин, залежатимуть від регістру. У Unix, при ігноруванні регістру використовується повний набір символів ISO 8859-1 Latin-1. Починаючи з gawk 3.1.4, регістр літер повністю обізнаний з локаллю, основуючись на засоби з C <ctype.h>, такі як isalpha() і tolupper().
LINT : Надає динамічний контроль над опцією --lint зсередини програми AWK.
NF : Кількість полів у поточному відрізку (number of fields).
NR : Загальна кількість відрізків (number of records), зустрінутих до даного моменту.
OFMT : Формат виводу чисел (output format). За узгодженням, "%.6g".
OFS : Розділювач полів виводу (output field separator). За узгодженням, пробіл.
ORS : Розділювач відрізків виводу (output record separator). За узгодженням, символ нового рядка.
PROCINFO : Члени цього масиву надають загальну інформацію про обіг програми AWK. На деяких системах, це можуть бути елементи "group1" по "groupn", де n буде номером додаткових груп процесу. Використайте оператор in щоб виявити ці елементи. Наступні елементи гарантовано наявні на вашій системі:
PROCINFO["egid"] : Значення системного виклику ?getegid(2).
PROCINFO["euid"] : Значення системного виклику ?geteuid(2).
PROCINFO["FS"] : Містить ланцюжок "FS", якщо відбувається розділення полів за допомогою FS, i "FIELDWIDTHS", якщо відбувається розділення полів через FIELDWIDTHS.
PROCINFO["gid"] : Значення системного виклику ?getgid(2).
PROCINFO["pgrpid"] : ID групи поточного процесу.
PROCINFO["pid"] : ID процесу.
PROCINFO["ppid"] : ID батьківського процесу.
PROCINFO["uid"] : Значення системного виклику ?getuid(2).
PROCINFO["version"] : Версія програми gawk. Цю змінну додано, починаючи з gawk 3.1.4.
RS : Розділювач відрізків вводу (record separator). Типово, символ нового рядка.
RT : Вказувач кінця відрізку (record terminator). Gawk присвоїть RT значення вхідного тексту, що збіглося з символом або регулярним виразом, вказаним у RS.
RSTART : Індекс першого символу, що збігся після виклику match(). 0, якщо збігу не було. (Це також означає що індекси символів почнуться з 1.)
RLENGTH : Довжина ланцюжка, що збіглася після виклику match(). -1, якщо збігу не відбулося.
SUBSEP : Символ, використовуваний для поділу індексів у масиві. Типово, "\034".
Масиви
Масиви індексуються за допомогою виразу в квадратних дужками ([ і ]). Якщо цей вираз є списком (вираз1, вираз2, ...), то масив індексується ланцюжком, що складається зі зчеплених (ланцюжкових) значень усіх виразів, розділених значенням змінної SUBSEP. Ця можливість використовується для імітації багатовимірних масивів. Наприклад:
і = "A"; j = "B"; k = "C"
x[і, j, k] = "hello, world\n"
присвоює елементові масиву x, індексованого як "A\034B\034C", ланцюжок "hello, world\n". Усі масиви в AWK асоціативні, тобто індексуються за ланцюжковим значенням.
Для перевірки, чи масив утримує певний індекс, можна використати спеціальний оператор in у if або while конструкціях:
if (val in array) print array[val]
Якщо масив багатомірний, використовуйте (і, j) in array.
Оператор in може бути також використаним у циклі for для перебирання всіх елементів масиву (ітерації).
Певний елемент може бути вилучено з масиву оператором delete. Крім того, оператор delete можна вжити для видалення всього масиву. Для цього потрібно вказати назву масиву без індексу.
Типи змінних і їхнє перетворення
Змінні і поля можуть бути числами (з рухомою точкою), ланцюжками, або і тим і іншим одночасно. Тип змінної залежить від контексту. У числових виразах змінна вважається числом, у ланцюжкових - ланцюжковим типом.
Якщо ви хочете, щоб змінна вважалася числом, додайте до неї 0. Якщо, навпаки ланцюжком - зчепіть її з порожнім ланцюжком.
Перетворення ланцюжка у число відбувається за допомогою strtod(3). Перетворення числа у ланцюжок - за допомогою ?sprintf(3), використовуючи значення CONVFMT як ланцюжок форматування, з числовим значення змінної як аргумент. Хоча всі числа в AWK вважаються числами з рухомою точкою, цілі значення завжди перетворюються як цілі. Тому маючи
CONVFMT = "%2.2f"
a = 12
b = a ""
ланцюжкове значення змінної b буде "12", а не "12.00".
Gawk виконує порівнювання у такий спосіб: якщо дві змінні мають числове значення, то вони порівнюються як числа; якщо одна змінна має числове значення, а друга є ланцюжком, що містить число, то змінні теж порівнюються як числа. В усіх інших випадках, відбувається перетворення числа у ланцюжок, і змінні порівнюються як ланцюжки. Два ланцюжки, природньо, порівнюються як ланцюжки. Зауважте, що стандарт POSIX втілює принцип чисел-ланцюжків скрізь, навіть з ланцюжковими константами. Це, безумовно, неправильно і gawk не слідує цьому. POSIX буде виправлено у наступній його версії.
Тож запам'ятайте, що ланцюжкові константи, такі як "57", не є "числами-ланцюжками", а саме ланцюжковими константами. Термін "число-ланцюжок" застосовується лише по відношенню до полів, вхідним даним getline, елементам FILENAME, ARGV, ENVIRON і тих елементам масиву, створених split(), що також будуть числовими ланцюжками. Ідея полягає в тім, що в такий спосіб розглядається лише ввід користувача, що виглядає, як число.
Неініційовані змінні, якщо звернутися до них, матимуть числове значення 0 і ланцюжкове "" (порожній ланцюжок).
Вісімкові і шіснадцяткові константи
Починаючи з 3.1 версії gawk, ви можете використовувати вісімкові і шіснадцяткові константи схожі на ті, що використовуються у C, у ваших програмах AWK. Так, наприклад, вісімкове значення 011 дорівнюватиме десятковому 9, тоді як шіснадцяткове 0x11 дорівнюватиме 17.
Ланцюжкові константи
Ланцюжкові константи (сталі) у AWK - це послідовності знаків, включених у подвійні лапки ("). Всередині ланцюжків розпізнаються певні екрановані послідовності, так само як і у C. А саме:
\ : Буквальний зворотня похила риска.
\a : Знак "alert" (тривога). Як правило, це знак BEL (дзвоник) набору символів ASCII.
\b : Знак повернення (відступу назад).
\f : Знак подання бланка (сторінки).
\n : Знак нового рядка.
\r : Знак повернення каретки.
\t : Знак кроку табуляції.
\v : Знак вертикального кроку табуляції.
\xhex : Знак, що буде передано через шістнадцяткове число, що стоїть після \x. Так само, як і в ANSII C, включені шістнадцядкові числа вважаються частиною екранованої послідовності. Наприклад, "\x1B" відповідає ESC (знак перемикання коду) набору символів ASCII.
**ddd : Знак, що буде передано через одно, двох або трьох-значне вісімкове число. Наприклад, "\033" відповідає ESC (знак перемикання коду) набору знаків ASCII.
**c : Буквальний знак c.
Екрановані послідовності також можуть використовуватись всередині регулярних виразів (наприклад, /[ \t\f\n\r\v]/ збігатиметься з пробільними знаками).
У стані сумісності, знаки, що передано як вісімкові або шістнадцяткові екрановані послідовності розглядаються буквально при використанню у сталих регулярних виразів. Тобто, /a\52b/ рівнозначно /a*b/.
ШАБЛОНИ І ДІЇ
AWK - це рядково-зорієнтована мова. Спершу вказується шаблон (порівнюється з відрізками), потім відповідна дія. Оператори дії включено у фігурні дужки { і }. Шаблон або дія можуть бути відсутніми, але, зрозуміло, не те й інше одночасно. Якщо не вказано шаблон, то дія виконуватиметься для кожного вхідного відрізку. Пропущена ж дія рівнозначна виразу .IP { print }
тобто, виводить весь відрізок.
Коментарі починаються із символу "#" і продовжуються до кінця рядка вихідного коду. Для поділу тверджень можуть використовуватися порожні рядки. Звичайно, вислів закінчується кінцем рядка, крім випадків, коли рядки закінчуються символами ",", {, ?, :, && або ||. Рядки, що закінчуються ключовими словами do або else , автоматично продовжуються на наступному рядку. В інших випадках, рядок може бути продовженим за допомогою символу "\", при цьому символ нового рядка екранується і буде ігноровано.
Декілька тверджень на одному рядку мають бути розділені символом ";". Це стосується як до виразів дії пари шаблон-дія (типовий випадок), так і до самих пар шаблон-дія.
Зразки
Зразки AWK можуть бути наступними:
BEGIN END /регулярний вираз/ умовний вираз шаблон && шаблон шаблон || шаблон шаблон ? шаблон : шаблон (шаблон) ! шаблон шаблон1, шаблон2
BEGIN і END являються двома спеціальними зразками, які не перевіряються на збіг із вхідними даними. Дії всіх шаблонів BEGIN поєднуються, начебто всі твердження було вказано в одному блоці BEGIN. Вказівки з цих блоків виконуються перед читанням будь-яких вхідних даних. Схожим чином поєднуються всі вирази END і виконуються після того як не залишилось жодного вводу (або після виконання exit). Зразки з BEGIN і END не можуть бути об'єднаними з іншими шаблонами. Дії у шаблонах BEGIN та END обов'язково має бути вказано.
Дії, прив'язані до шаблонів /регулярний вираз/, виконуються для всіх вхідних відрізків, що збіглися з цим регулярним виразом. Правила регулярних виразів відповідають описаним в ?egrep(1); швидкий огляд ви знайдете нижче.
Умовні вирази можуть складатися з будь-яких операторів, описаних нижче у розділі, присвяченому діям. Загалом, вони перевіряють чи певні поля збігаються з певними регулярними виразами.
Оператори &&, || і ! - це логічні І, АБО та НІ, відповідно. Ці оператори застосовуються для об'єднання простіших шаблонів. (Схоже до C, вони здійснюють короткі обчислення логічних виразів.) Як і в більшості мов, для зміни черги обчислень можуть застосовуватися круглі дужки.
Оператор ?: відповідає тому самому операторові з C. Якщо перший шаблон справдився, то для перевірки використовується другий шаблон, у протилежному випадку - третій. Обчислюється тільки другий або тільки третій шаблон. Вирази на зразок шаблон1, шаблон2 називаються шаблонами діапазону. Вони збігаються з усіма відрізками, починаючи з відрізку, що збігся з шаблоном1, і закінчуючи тим, який збігся з шаблоном2, включно. Цей шаблон не може бути об'єднано з жодним іншим.
Регулярні вирази
Регулярні вирази AWK - це розширена версія регулярних виразів egrep. Вони складаються з наступних символів:
Інтервальні вирази можна використовувати, тільки якщо на командному рядкові була задана або опція --posix, або --re-interval.
c : збігається з не-метасимволом c.
**c : збігається з буквальним символом c.
&. : збігається з будь-яким символом, включаючи символ нового рядка.
^ : збігається з початком рядка.
$ : збігається з кінцем рядка.
[abc...] : список символів, збігається з будь-яким одним символом з abc....
[^abc...] : негативний список символів, збігається з будь-яким символом, крім abc....
r1|r2 : чергування: збігається або з r1, або з r2.
r1r2 : зчеплення: збігається спершу з r1, потім з r2.
r+ : збігається з одним або більше r.
r* : збігається з нуль або більше r.
r? : збігається з нуль або одним r.
(r) : угруповування: збігається з r.
r{n} :
r{n,} :
r{n,m} : Одне або два числа у фігурних дужках позначають інтервальний вираз. Якщо в дужках наведено лиш одне число, то попередній регулярний вираз r має повторитись n разів. Якщо вказано два числа, розділених комою, то r має повторитись від n до m разів. Якщо вказано лиш одне число з комою, то r має повторитись щонайменше n разів.
\y : збігається з порожнім ланцюжком на початку або наприкінці слова.
\B : збігається з порожнім ланцюжком у слові.
< : збігається з порожнім ланцюжком на початку слова.
> : збігається з порожнім ланцюжком наприкінці слова.
\w : збігається з будь-яким символом "слова" (буква, цифра або твердий пробіл).
\W : збігається з будь-яким символом, крім тих що складають "слово".
` : збігається з порожнім ланцюжком на початку буфера.
\' : збігається з порожнім ланцюжком наприкінці буфера.
Всі екрануючі послідовності, дійсні у ланцюжкових константах (дивіться нижче), можуть вживатися також у регулярних виразах.
Класи символів - нова риса, привнесена стандартом POSIX. Клас символів - це спеціальна система позначень списків символів, що мають певну спільну ознаку. Одночасно, самі символи списку для різних країн і/або для різних наборів символів (кодувань) можуть відрізнятись. Так наприклад, поняття що являє собою символ алфавіта, може розрізнятися для США і Франції.
Класи символів дійсні в регулярних виразах лише всередині квадратних дужок, які ми використовуємо для списку символів. Клас символів складається з [:, ключового слова, що позначає клас, і :]. Нижче наведені класи символів, визначені стандартом POSIX:
[ : alnum:]: Буквено-цифрові символи (буква, цифра, твердий пробіл).
[ : alpha:]: Алфавітні символи.
[ : blank:]: Символи пробілу або табуляції.
[ : cntrl:]: Керуючі символи.
[ : digit:]: Цифри.
[ : graph:]: Символи, що виводяться на екран і їх "видно". (Пробіл виводиться, але "не видно", у той час, як a - і те й інше.)
[ : lower:]: Алфавітні символи нижнього регістру.
[ : print:]: Символ, що можна вивести на екран (не керуючий символ).
[ : punct:]: Розділові знаки (не літери, не цифри, не керуючі символи і не пробіли).
[ : space:]: Символи пробілу (пробіл, табуляція, знак заміни сторінки, (нового рядка)).
[ : upper:]: Алфавітні символи верхнього регістру.
[ : xdigit:]: Символи, що є шістнадцятковими цифрами.
Так, наприклад, до появи стандарту POSIX, для збігу текстових символів треба було вказати /[A-Za-z0-9]/. Якщо набір символів (кодування) містив у собі інші символи, то збігу не відбувалося. З класами символів POSIX ви можете написати /?alnum:/ і це збіжиться автоматично зі всіма алфавітними та цифровими символами вашого набору символів.
У списках символів можуть бути вказані ще дві спеціальні послідовності знаків. Вони вживаються з не-ASCII наборами символів. Одна з них може вказувати один символ (так званий елемент сортування) за допомогою двох, а друга послідовність - це еквівалентні з точки зору сортування символи. (Наприклад, у Франції, звичайна літера "e" і акцентована e` - еквівалентні.)
Символи сортування : Символи сортування - це багатосимвольні позначення, включені у [. й .]. Наприклад, якщо ch - це символи сортування, то ?.ch. - це регулярний вираз, що збігається з відповідним елементом сортування (у певній локалі і наборі символів), тоді як звичний [ch] - це регулярний вираз, що збігається або з c, або h.
Класи еквівалентності
: Клас еквівалентності - це залежне від локалі ім'я для списку символів, що є еквівалентними. Ім'я буде включене між [= й =]. Наприклад, ім'я e може бути використаним для представлення "e", "Є", і "e". У цьому випадку, **<span class="createlink"><a href="/cgi-bin/ikiwiki.cgi?page=__61__e__61__&from=man%2Fman1%2Fgawk.1&do=create" rel="nofollow">?</a>=e=</span>** - це регулярний вираз, що збігається з **e**, **Є** і **e
**.
Ці можливості дуже важливі в не-англійських локалях. Бібліотечні функції, використовувані gawk для роботи з регулярними виразами, на сьогодні розпізнають тільки класи символів POSIX. Вони не розпізнають символи сортування та класи еквівалентності.
Оператори \y, \B, <, >, \w, \W, ` й \', притаманні gawk, являються розширеннями, основаними на можливостях бібліотек регулярних виразів GNU.
Різноманітні опції командного рядка також визначають, як gawk інтерпретує символи, які утворюють регулярні вирази.
Без опцій : Типово, gawk надає всі можливості регулярних виразів POSIX і розширень GNU, як описано вище. Не підтримуються тільки інтервальні вирази.
--posix : Підтримуються лише регулярні вирази POSIX, оператори GNU не мають спеціального значення. (Наприклад, \w відповідає буквальній літері w). Інтервальні вирази дозволено.
--traditional : Використовуються традиційні регулярні виразу Unix awk. Оператори GNU не мають спеціального значення, інтервальні вирази не підтримуються, так само класи символів POSIX (?alnum: і т.д. ) не підтримуються. Символи, вказані за допомогою вісімкової або шістнадцяткової екранованої послідовності, сприймаються буквально, навіть якщо вони являють собою метасимволи регулярних виразів.
--re-interval : Дозволяє використовувати інтервальні вирази, навіть якщо вказано опцію --traditional.
Дії
Твердження дії включаються у фігурні дужки { й }. Твердження дії можуть складатися з звичайних виразів присвоювання, умовних виразів і циклів, які ви зустрінете в багатьох інших мовах. Оператори, контрольні структури і вирази вводу/виводу схожі на подібні їм з мови C.
Оператори
У AWK визначено наступні оператори, у порядку зменшення пріоритету:
(...) : Угруповування.
$ : Посилання на поле.
++ -- : Інкремент і декремент, обидва можуть бути префіксними і постфіксними.
^ : Зведення в ступінь (можна також використовувати і = з оператором присвоювання).
+ - ! : Унарний плюс, унарний мінус і логічне заперечення.
* / % : Множення, ділення і рештка.
+ - : Додавання і віднімання.
пробіл : Зчеплення рядків.
< > :
<= >= :
!= == : Звичайні операції порівнювання.
~ !~ : Збіг і заперечення збігу з регулярним виразом. Примітка: не використовуйте сталий регулярний вираз (/foo/) ліворуч від ~ або !~, тільки праворуч. Вираз /foo/~ expr має те саме значення, що й (($0 ~ /foo/) ~ expr). Звичайно, це не те, що малося на увазі.
in : Існування в масиві.
&& : Логічне І.
|| : Логічне АБО .
? : : Умовний вираз C. Він має вигляд вираз1 ? вираз2 : вираз3. Якщо вираз1 є істиною, то результатом буде значення виразу2, у протилежному випадку - виразу3. Обчислюється лише один з виразу2 або виразу3.
= += -= :
*= /= %= ^= : Присвоювання. Підтримується як просте присвоєння (змінна=значення), так і присвоювання за допомогою складених операторів.
Керування потоком
Операторами керування потоком є: .IP if (умова) твердження [ else твердження ]
while (умова) твердження
do твердження while (умова)
for (вираз1; вираз2; вираз3) твердження
for (змінна in масив) твердження
break
continue
delete масив[індекс]
delete масив
exit [ вираз ]
{ твердження }
Вирази вводу/виводу
Твердженнями вводу/виводу є наступні:
close(файл [, як]) : Закрити файл, канал або співпроцес. Опція як повинна вживатися лише у випадку закриття одного кінця двостороннього каналу або процесу. Це має бути ланцюжок (lqto(rq або (lqfrom(rq.
getline : Надасть $0 значення наступного прочитаного відрізку. Встановить NF, NR, FNR.
getline <файл : Надасть $0 значення наступного відрізку файла. Встановить NF.
getline змінна : Надасть змінній значення наступного відрізку. Встановить NR, FNR.
getline змінна <файл : Надасть змінній значення наступного відрізку з файла.
команда | getline [змінна] : Виконати команду, передаючи її вивід або $0, або змінній.
команда |& getline [змінна] : Виконати команду як співпроцес, передаючи її вивід $0 або змінній. Співпроцеси є розширенням gawk.
next : Припинити обробку поточного вхідного відрізку. Прочитати наступний вхідний відрізок і почати його обробку з самого початку, з першого шаблона програми AWK. Якщо досягнуто кінця вхідних даних, блок(и) END буде виконано, якщо є такі.
nextfile : Припинити обробку поточного вхідного файла. Наступний вхідний відрізок буде прочитано з наступного вхідного файла. FILENAME і ARGIND оновлюються, FNR перезаладоване до 1 і обробка починається з першого шаблона програми AWK. Якщо досягнуто кінця вхідних даних, то буде виконано блок(и) END, якщо є такі.
print : Вивести поточний відрізок. Вивід відрізку закінчується вмістом змінної ORS.
print спискок-виразів : Вивести вирази. Вирази розділено вмістом змінної OFS. Вивід відрізку закінчується вмістом змінної ORS.
print спискок-виразів >файл : Вивести вирази до файла. Вирази розділено вмістом змінної OFS. Вивід відрізку закінчується вмістом змінної ORS.
printf формат, спискок-виразів : Форматувати і вивести.
printf формат, спискок-виразів >файл : Форматувати і вивести до файла.
system(команда) : Виконати оболонкову команду, і повернути код її виходу. (Може не працювати на не-POSIX системах.)
fflush([файл]) : Звільнити буфери, зв'язані з відкритим для виводу файлом або каналом файл. Якщо файл не вказано, відбувається звільнення буфера стандартного виводу. Якщо файл вказано як порожній ланцюжок, то відбувається скидання буферів усіх відкритих для виводу файлів і каналів.
Дозволені також додаткові перенаправлення вводу-виводу для print і printf:
print ... >> файл : додасть виведені дані до файла.
print ... | команда : передасть дані каналу.
print ... |& команда : передасть дані співпроцесу.
Команда getline повертає 0 по досягненні кінця файла і -1 у разі помилки. Якщо сталася помилка, ERRNO містить ланцюжок з описом помилки.
Зауваження: при використанні каналу або співпроцесу з getline або print чи printf всередині циклу, ви маєте використати close() для створення нових примірників команди. AWK не закриває автоматично канали або співпроцеси після повернення ними EOF (знак кінця файла).
Вираз printf
AWK printf і функція sprintf() (дивіться нижче) розпізнають наступні формати перетворень:
%c : ASCII-символ. Якщо аргумент %c є числом, то його буде інтерпретовано як символ і виведено. У протилежному випадку, аргумент буде інтерпретовано як ланцюжок, і виводиться тільки перший символ цього ланцюжка.
%d :
%і : Десяткове число (ціла частина).
%e :
%E : Число з рухомою точкою у формі [-]d.dddddde[+-]dd. Формат %E використовує E замість e.
%f : Число з рухомою точкою у формі [-]ddd.dddddd.
%g :
%G : Використовувати формат %e або формат %f, у залежності від того, чий вивід коротший, з придушеними незначущими нулями. Формат %G використовує %E замість %e.
%o : Беззнакове вісімкове число (ціле).
%u : Беззнакове десяткове число (також ціле).
%s : Ланцюжок символів.
%x :
%X : Беззнакове шістнадцяткове число (ціле). Формат %X використовує ABCDEF замість abcdef.
%% : Єдиний символ %. Перетворення аргументу не відбувається.
Зауваження: під час використання вказівників формату цілих чисел із значеннями, що перевищують обсяг цілого long у C, gawk автоматично переключається до вказівника %g. Якщо вказана опція --lint на командному рядку, gawk попередить вас про це. Інші версії awk можуть вивести недійсні числа або поводитись невизначено.
Можна також вказати додаткові параметри між символом % і літерою формату:
n$ : Використати n-ний аргумент форматування у цьому місці. Це називається вказівником позиції і застосовується насамперед у перекладених версіях форматувальних ланцюжків, а не у оригінальних текстах програми AWK. Це являється розширенням gawk.
- : Вираз вирівнюється вліво у своєму полі.
пробіл : Для числових перетворень, виводити перед додатковими значеннями пробіл, а перед від'ємними - знак мінуса.
+ : Знак плюс перед параметром ширини (дивіться нижче), вказує завжди виводити знак для числових перетворень, навіть якщо форматовані дані мають додаткове значення. + пересилює вказівника простору.
# : Використовувати "альтернативну форму" для деяких літер форматів. Для %o - вивести спереду нуль. Для %x і %X - вивести спереду 0x або 0X, якщо результат відмінний від нуля. Для %e, %E і %f - результат завжди буде містити десяткову точку. Для %g і %G - кінцеві нулі не будуть прибрані.
0 : Передній 0 (нуль) служить вказівником того, що виведене поле має бути заповнене нулями, а не пробілами. Це стосується навіть не-числових форматів виводу. Цей вказівник має зміст лише тоді, коли ширина поля є більшою за виведене значення.
ширина : Поле має бути заповнено до цієї ширини. Звичайно, поле заповнюється пробілами. Якщо вказано , то поле заповниться нулями.
.точність : Число, що визначає точність виводу. Для форматів %e, %E і %f вказує кількість цифр, виведених праворуч від десяткової точки. Для форматів %g і %G вказує максимальну кількість значущих цифр. Для форматів %d , %o, %і, %u, %x і %X вказує мінімальну кількість виведених цифр. Для %s вказує максимальну кількість виведених символів ланцюжка.
Підтримуються динамічні ширина і точність функції printf() ANSI C. Якщо замість ширини або точності вказати *, то їхні значення будуть взяті зі списку аргументів printf або sprintf().
Спеціальні назви файлів
При перенаправленні вводу-виводу print і printf до файла або getline з файла, gawk розпізнає деякі спеціальні назви файлів. Ці назви можуть використовуватись для доступу до дескрипторів відкритих файлів, успадкованих від батьківського процесу gawk (звичайно оболонки). Ці назви файлів можуть також використовуватись на командному рядку для вказівки фалів, що містять дані. Ось їхній перелік:
/dev/stdin : Стандартний ввід.
/dev/stdout : Стандартний вивід.
/dev/stderr : Вивід стандартної помилки.
/dev/fd/n : Файл, що відповідає відкритому дескриптору файла n.
Останні особливо корисні для виводу помилок. Наприклад:
print "You blew it!" > "/dev/stderr"
тоді як звичайно вам довелося ви використати
print "You blew it!" | "cat 1>&2"
Наступні спеціальні назви файлів можуть використовуватись з оператором співпроцесу |& для створення мережних з'єднань TCP/IP.
/inet/tcp/lport/rhost/rport : Файл для TCP/IP з'єднання на локальному порту lport із віддаленим вузлом rhost на віддаленому порту rport. Використайте порт 0, щоб система сама вибрала потрібний порт.
/inet/udp/lport/rhost/rport : Схожий до попереднього, але для UDP/IP з'єднання.
/inet/raw/lport/rhost/rport : Зарезервований для майбутнього вжитку.
Ще інші, надають доступ до інформації про запущені процеси gawk. Ціназвифайлівзастаріли. Використовуйте натомість масив (змінної середовища) PROCINFO для отримання відповідної інформації. Ось ці назви:
/dev/pid : Читання цього файла повертає ID поточного процесу у вигляді десяткового числа з символом нового рядка наприкінці.
/dev/ppid : Читання цього файла повертає ID батьківського процесу у вигляді десяткового числа з символом нового рядка наприкінці.
/dev/pgrpid : Читання цього файла повертає ID групи поточного процесу у вигляді десяткового числа з символом нового рядка наприкінці .
/dev/user : Читання цього файла повертає один відрізок, що закінчується символом нового рядка. Поля розділено пробілами. $1 отримає значенням системного виклику ?getuid(2), $2 - значення системного виклику ?geteuid(2), $3 - значення системного виклику ?getgid(2) і $4 - значення системного виклику ?getegid(2). Якщо є додаткові поля, то вони отримають значення ID груп, повернутими getgroups(2). Багаточисельні групи можуть не підтримуватись всіма системами.
Математичні функції
AWK має наступні вбудовані математичні функції:
atan2(y, x) : повертає арктангенс y/x у радіанах.
cos(вираз) : повертає косинус виразу, вираз має бути подано в радіанах.
exp(вираз) : експонентна функція.
int(вираз) : відкидає дробову частину.
log(вираз) : функція натурального логарифма.
rand() : повертає випадкове число N між 0 і 1, тобто 0 < N < 1.
sin(вираз) : повертає синус виразу. Вираз має бути подано в радіанах.
sqrt(вираз) : функція квадратного кореня.
srand([вираз]) : встановлює вираз як нове зерно для генератора випадкових чисел. Якщо вираз не вказано, то використовується поточний час. Значення, що повертається, дорівнює попередньому зерну генератора випадкових чисел.
Ланцюжкові функції
Gawk має наступні вбудовані ланцюжкові функції:
asort(s [, d]) : Повертає кількість елементів джерельного масиву s. Елементи s сортовані, використовуючи звичайні правила gawk порівнювання значень. Індекси відсортованих значень заміняються послідовністю цілих чисел, починаючи з 1. Якщо буде вказаний додатковий масив призначення d, тоді s спочатку копійовано в d, після чого d буде відсортовано, залишаючи індекси джерельного масиву s незмінними.
asorti(s [, d]) : Повертає кількість елементів джерельного масиву s. Поведінка нагадує ту, яку ми спостерігаємо в asort(), за винятком того, що індекси масиву використовуються для сортування, а не значення елементів масиву. Після закінчення, масив буде індексовано десятковими числами, кожний елемент зі значенням попереднього індексу. Старі значення масиву відкидаються, тож додайте другий масив, якщо хочете зберегти оригінальний.
gensub(r, s, h [, t]) : шукає в рядку t збіги з регулярним виразом r. Якщо h є ланцюжком, що починається з g або G, то замінює всі збіги r на s. У протилежному випадку, h буде числом, що вказуватиме, який по рахунку збіг r замінити. Якщо t не вказано, то використовується $0. У тексті заміни s, послідовність \fB\fP_n, де n - це цифра від 1 до 9, може бути використаною для посилання на текст n-нної, включеної в дужки, частини виразу. Послідовність \0 посилається на весь текст, що збігся, так само символ &. На відміну від sub() і gsub(), змінений ланцюжок буде повернуто як результат функції, а оригінальний вихідний ланцюжок залишається незмінним_.
gsub(r, s [, t]) : Кожна частина ланцюжка t, що збіглася з регулярним виразом r, замінюється на ланцюжок s і повертається кількість здійснених замін. Якщо t не вказаний, то використовується $0. Місце & у тексті заміни s візьме ланцюжок, що збігся. Для виводу буквального символу & використовуйте & (це має виглядати як \fB"\&"\fP). (Для подальшої дискусії стосовно & і \fB\fP у тексті заміни у sub(), gsub() і gensub(), зверніться до "GAWK: Effective AWK Programming".)
index(s, t) : Повертає індекс ланцюжка t у ланцюжку s, або 0, якщо t не знайдено. (Це також означає, що відлік індексів знаків починається з 1.)
length([s]) : Повертає довжину ланцюжка s або, якщо s не вказано, довжину $0.
match(s, r [, a]) : Повертає позицію в s, де відбувся збіг з регулярним виразом r, або 0, якщо збігу з r не було. Встановлює значення RSTART і RLENGTH. Зауважте, що послідовність аргументів є тією самою, що й для оператора ~, тобто ланцюжок ~ regex. Якщо додатково вказати масив a, його буде очищено, після чого елементи з 1 по n заповнено частинами s, які збігаються з відповідними, взятими в дужки частинами виразу r. Елемент з індексом 0 в a утримуватиме ту частину s, яка збіглася з цілим регулярним виразом r. Елементи, індексовані як a[n, "start"] і a[n, "length"] надають інформацію про перший індекс у ланцюжку і довжину кожної частини ланцюжка, яка зійшлася.
split(s, a [, r]) : Розбиває рядок s, керуючись регулярним виразом r, зберігає результат у масив a і повертає кількість полів. Якщо r не вказано, то використовується FS. Масив a попередньо очищається. Функція працює подібно до поділу на поля, описаного вище.
sprintf(fmt, expr-list) : Виводить список виразів відповідно до формату fmt.
sub(r, s [, t]) : Подібно до gsub(), але замінюється тільки перша частина ланцюжка, яка збіглася з r.
substr(s, і [, n]) : Повертає n-символьну частину ланцюжка s, починаючи з і. Якщо n не вказати, то повертається залишок рядка s.
tolower(ланцюжок) : Повертає копію ланцюжка, у якій всі символи верхнього регістру, переведені у відповідні їм символи нижнього регістру. Не-алфавітні символи залишаються без змін.
toupper(ланцюжок) : Повертає копію ланцюжка, у якій усі символи нижнього регістру, переведені у відповідні їм символи верхнього регістру. Не-алфавітні символи залишаються без змін.
Функції роботи з часом
Оскільки одним з основних застосувань програм AWK являється обробка журнальних файлів, що містять мітки часу, gawk надає декілька функцій для отримання і форматування міток часу.
Функції порозрядних операцій
Починаючи з версії 3.1 gawk, з'явилися додаткові функції по обробці бітів. Їхня дія полягає у перетворенні чисел з рухомою точкою подвійної точності у беззнакові довгі (unsigned long) цілі, здійснення операцій, після чого перетворення чисел назад у числа з рухомою точкою. Ось ці функції:
mktime(формат) : Перетворює формат у мітку часу схоже до systime(), наведеної нижче. Формат є ланцюжком у формі YYYY MM DD HH MM SS [DST]. Вміст ланцюжка має складатись з шести або семи чисел, що відповідатимуть, відповідно: повному запису року, місяцю від 1 до 12, даті від 1 до 31, годині від 0 до 23, хвилині від 0 до 59, секунді від 0 до 60 і, необов'язковій, вказівці літнього часу. Значення цих чисел не обов'язково мають бути в межах, вказаних вище, наприклад, година -1 означатиме одну годину до півночі. Час обчислюється за нуль-основаним Григоріанським календарем. Припускається, що це час місцевого часового поясу. Якщо прапорець літнього часу додатковий, вважатиметься, що це літній час, у протилежному випадку, що це стандартний час. У випадку від'ємного значення, mktime() намагається сама визначити чи вказаний час є літнім, чи ні. Якщо формат містить недостатньо елементів, або якщо обчислений час не є дійсним, mktime() повертає -1.
strftime([формат [, час]]) : Форматує час відповідно до вказаного формату. Час має бути вказано у тій самій формі, яка повертається systime(). Якщо час не вказано, то використовується поточний час. Якщо не вказано формат, то використовується формат поза вибором, еквівалентний виводові date(1). Для гарантії правильності використовуваних форматів, зверніться до специфікації функції strftime() ANSI C. Вільно розповсюджувана версія ?strftime(3) і відповідна сторінка посібника до неї поставляються з gawk. Якщо ця версія використовувалась для збірки gawk, то всі формати, описані в посібнику, будуть доступні програмі gawk.
systime() : Повертає поточний час у вигляді кількості секунд із початку Epoch (північ UTC, 1 січня 1970 року, на системах POSIX).
and(v1, v2) : Повертає порозрядне І значень v1 і v2.
compl(val) : Повертає порозрядне доповнення значення val.
lshift(val, count) : Повертає значення val, зсунутого вліво на count бітів.
or(v1, v2) : Повертає порозрядне АБО значень v1 і v2.
rshift(val, count) : Повертає значення val, зсунутого вправо на count бітів.
xor(v1, v2) : Повертає порозрядне XOR значень v1 і v2.
Функції інтернаціоналізації
Починаючи з gawk 3.1, можна використовувати наступні функції для перекладу ланцюжків під час обігу програми. Для повного опису дивіться "GAWK: Effective AWK Programming".
bindtextdomain(directory [, domain]) : Вказує каталог directory, де gawk шукатиме файли з закінченням .mo, у випадку, якщо вони не були або не можуть бути розміщеними у "стандартні" місцезнаходження. Вона повертає теку, до якої "прив'язано" домен domain. Домен з узгодженням вказується у змінній TEXTDOMAIN . Якщо теку вказано як порожній рядок (""), тоді bindtextdomain() повертає поточну "прив'язку" для даного домену.
dcgettext(s [, domain [, \ : category]]) Повертає переклад ланцюжка s у текстовому домені domain і категорії локалі category. Стандартним значенням для домену буде значення змінної TEXTDOMAIN. Стандартним значенням категорії - "LC_MESSAGES". Якщо ви хочете поміняти категорію, впевніться що вона відповідає одній з дійсних категорій локалі, описаних у GAWK: Effective AWK Programming. Ви також маєте вказати текстовий домен. Використайте TEXTDOMAIN для вживання поточного домену.
dcngettext(s1 , s2 , n [, \ : domain [, category]]) Повертає форму множини ланцюжків s1 і s2, що відповідає числу n, згідно з текстовим доменом domain і категорією локалі category. Стандартним значенням для домену буде значення змінної TEXTDOMAIN. Стандартним значенням категорії - "LC_MESSAGES".
ФУНКЦІЇ КОРИСТУВАЧА
Функції в AWK визначаються у наступний спосіб:
function ім'я(список параметрів) { \ твердження }
Функції виконуються при виклику їх з виразів шаблонів або дій. Параметри, вказані при виклику функції використовуються для надання значень формальним параметрам оголошеним у функції. Масиви завжди передаються через посилання на них, інші змінні - через їхнє значенням.
Оскільки функції не завжди були частиною мови AWK, підтримка локальних змінних залишає бажати кращого: вони вказуються як додаткові параметри в списку параметрів. Загальноприйнятою умовністю є відокремлювати локальні змінні в списку параметрів від дійсних параметрів додатковими пробілами. Наприклад:
function f(p, q, a, b) # a & b - локальні змінні
{
...
}
Виклик функції
/abc/ { ... ; f(1, 2) ; ... }
Ліва дужка у виклику функції обов'язково має стояти одразу за назвою функції, без пробілів . Цю вимогу введено для запобігання неоднозначності з операцією зчеплення. Це обмеження не стосується, розглянутих вище, вбудованих функцій.
Функції можуть викликати одне одного і самі себе. Параметрам функцій, використовуваним як локальні змінні, присвоюється значення порожнього рядка і нуля під час виклику функцій (без надання значення параметрам).
Для повернення певного значення з функції використовуйте вираз return. Повернене значення буде невизначеним, якщо не вказано вираз або, якщо вихід з функції відбувається після закінчення тіла функції.
Якщо вказано опцію --lint, то gawk попереджатиме про всі виклики невизначених функцій не під час роботи програми, а заздалегідь, під час попередньої обробки. Виклик невизначеної функції під час роботи програми спричинить фатальну помилку.
Замість слова function можна використати func.
ДИНАМІЧНІ ВБУДОВАНІ ФУНКЦІЇ
Починаючи з версії 3.1 gawk, вам надається можливість додавати нові вбудовані функції запущеному інтерпретатору gawk. Повний опис є поза масштабом цієї сторінки; зверніться до "GAWK: Effective AWK Programming".
extension(object, function) : Динамічно завантажити спільний об'єкт object і викликати функцію function з цього об'єкту, для ініціалізації. Обидва параметри має бути надано як ланцюжки. Вертає значення, повернене функцією function.
Ця функція описана у GAWK: Effective AWK Programming", але все, що стосується цієї можливості, може помінятись у наступному випуску. Ми радимо уникати цієї риси там, де ви не хочете міняти код пізніше.
СИГНАЛИ
pgawk розпізнає наступні два сигнали:
ПРИКЛАДИ
Вивести і відсортувати назви всіх користувачів:
SIGUSR1 : Викличе викид стеку профілю і викликів функцій у файл профілю awkprof.out або той що було вказано з командного рядка опцією --profile. Програма після цього продовжить свою роботу.
SIGHUP : Викличе викид стеку профілю і викликів функцій і припинить роботу програми.
BEGIN { FS = ":" }
{ print $1 | "sort" }
Підрахувати кількість рядків у файлі:
{ nlines++ }
END { print nlines }
Додати номер попереду кожного рядка у файлі:
{ print FNR, $0 }
З'єднати і додати нумерацію рядків (те саме):
{ print NR, $0 }
Запустити зовнішню команду для окремих рядків даних:
tail -f access_log | \
awk '/index.*/ {system("nmap " $1 ">> logs/index.html")}'
ІНТЕРНАЦІОНАЛІЗАЦІЯ
Ланцюжкові константи - це послідовність знаків, включених у подвійні лапки. У не-англійських середовищах є можливість позначити ланцюжки програми AWK як такі що підлягають перекладу. Такі ланцюжки позначаються в програмах AWK переднім знаком твердого пробілу ("_"). Наприклад: .IP gawk 'BEGIN { print "hello, world" }'
завжди виведе hello, world. Зате, .IP gawk 'BEGIN { print _"hello, world" }'
може видрукувати "bonjour, monde" у Франції.
Є кілька кроків, які потрібно зробити для створення і запуску локалізованої програми AWK. .IP 1. Додайте дію у BEGIN, яка надасть значення змінній TEXTDOMAIN, що буде асоційоване з назвою вашої програми.
**DEGIN { TEXTDOMAIN = "myprog" }**
Це дозволяє **gawk** знайти файли **.mo**, що вживатимуться з цією програмою. Без цієї вказівки, **gawk** використовує текстовий домен **messages**, який ймовірно не міститиме переклади для вашої програми. .IP 2. Помітьте всі ланцюжки, які ви хочете, щоб було перекладено, твердим пробілом спереду. .IP 3. Якщо треба, використайте функції **dcgettext()** або **bindtextdomain()** у програмі, як було описано вище. .IP 4. Виконайте **gawk --gen-po -f myprog.awk > myprog.po** для створення файла **.po** для вашої програми. .IP 5. Перекладіть згенерований файл **.po**, після чого створіть відповідний файл **.mo** і інсталюйте його.
Це в загальних рисах. Повний опис цієї процедури ви знайдете у "GAWK: Effective AWK Programming".
СУМІСНІСТЬ З POSIX
Основна мета gawk - це сумісність як зі стандартом POSIX, так і з останніми версіями awk для UNIX. Для цього gawk містить у собі наступні можливості, не описані в книзі, але які включені у версію awk від Bell Laboratories і стандарт POSIX.
У книзі сказано, що присвоєнню значень змінним на командному рядку, відбувається перед відкриттям awk файлів, одразу після виконання блоку BEGIN. Однак у ранніх реалізаціях, таке присвоєння значень відбувалося до виконання блоку BEGIN. Ця "можливість" почала застосовуватися в додатках. Після того, як awk було приведено у відповідність із власною документацією, для того щоб задовольнити додатки, залежні від старого поводження, було додано опцію -v, що дозволяє надання значення змінним до виконання BEGIN. (Із вводом цієї можливості погодилися як розробники від Bell Laboratories, так і GNU.)
Опція -W для окремих особливостей реалізацій привнесено стандартом POSIX.
При обробці аргументів gawk використовує спеціальну опцію "--" для позначення кінця аргументів. У режимі сумісності, вона викликатиме попередження про існування невідомих опцій, але вони ігноруються. У звичайному режимі, такі аргументи передаються для обробки програмі AWK.
У книжці AWK не описано значення, що повертається srand(). Стандарт POSIX вказує повертати попереднє значення зерна, що дозволяє стежити за послідовністю випадкових чисел. Тому srand() у gawk також повертає значення поточного випадкового зерна.
Інші нові можливості: можливість використання декількох опцій -f (з MKS awk); масив ENVIRON; екрануючі послідовності \a і \v (спочатку з'явилися в gawk і потім включені у версію від Bell Laboratories); вбудовані функції tolower() і toupper() (від Bell Laboratories); означення форматування ANSI C printf (вперше з'явилися у версії від Bell Laboratories).
ІСТОРИЧНІ РИСИ
ІСТОРИЧНІ РИСИ
gawk підтримуються дві риси ранніх версій AWK. Перша - можливість виклику вбудованої функції length() не тільки без аргументу, але й без дужок. Тобто, .IP a = length # Holy Algol 60, Batman!
є тим самим, що й .IP a = length()
a = length($0)
Цю можливість помічено як застарілу у стандарті POSIX, і gawk з опцією --lint видаватиме попередження про це.
Друга можливість - це використання операторів continue і break поза тілом циклів while, for або do. Традиційні реалізації AWK сприймали подібне використання цих операторів, як еквівалентне операторові next. Gawk підтримує таке використання, якщо вказано опцію --traditional.
РОЗШИРЕННЯ GNU
Gawk має ряд розширень у порівнянні з POSIX awk. Вони описані в цьому розділі. Наведені нижче розширення можна заборонити запуском gawk з опцією --traditional.
Наступні риси відсутні у POSIX awk:
- Не здійснюється пошук шляху до файлів, вказаних через опцію -f. Тому змінна середовища AWKPATH не є спеціальною.
- Екрануюча послідовність \x. (Скасовується --posix.)
- Функція fflush(). (Скасовується --posix.)
- Можливість продовжувати рядки після ? й :. (Скасовується --posix.)
- Вісімкові і шістнадцяткові константи у програмах AWK.
- Змінні ARGIND, BINMODE, ERRNO, LINT, RT і TEXTDOMAIN не мають спеціального значення.
- Змінна IGNORECASE і її побічні ефекти відсутні.
- Змінна FIELDWIDTHS і поділ на поля фіксованої довжини.
- Відсутній масив PROCINFO.
- Використання RS як регулярного виразу.
- Спеціальні назви файлів для перенаправлення вводу/виводу не розпізнаються.
- Оператор |& для створення співпроцесу.
- Можливість поділу на окремі символи шляхом присвоєння порожнього значення змінній FS або третього аргументу split().
- Необов'язковий другий аргумент функції close().
- Необов'язковий третій аргумент функції match().
- Можливість використання вказівників позиції з printf і sprintf().
- Використання delete масив для усунення змісту цілого масиву.
- Використання nextfile для зупинки обробки поточного вхідного файла.
- Функції and(), asort(), asorti(), bindtextdomain(), compl(), dcgettext(), dcngettext(), gensub(), lshift(), mktime(), or(), rshift(), strftime(), strtonum(), systime() і xor(). .IP o Локалізовані ланцюжки.
- Динамічне додання нових вбудованих функцій завдяки extension().
Книжка з AWK не визначає значень, що повертаються функцією close(). Функція close() програми gawk повертає значення з fclose(3) або ?pclose(3) при закритті файла або каналу, відповідно. Повернене значення дорівнюватиме -1, якщо іменований файл, канал або співпроцес не було відкрито шляхом перенаправлення.
Якщо під час виклику gawk з опцією --traditional, аргумент fs опції -F має значення "t", то значенням FS буде символ табуляції. Зауважте, що введення gawk -F\t ... призведе лишень до екранування символу "t", а не до передачі "\t" опції -F. Оскільки це досить специфічний випадок, то він не являється стандартним поводженням. Це також не буде працювати, якщо вказано опцію --posix. Якщо вам дійсно потрібний символ табуляції як розділювач полів, то найкраще скористатися одинарними лапками: gawk -F'\t' ...
Якщо gawk конфігуровано з --enable-switch під час компіляції, тоді він розумітиме додаткові вирази керування потоком:
switch (вираз) {
case значення|regex : твердження
...
[default: твердження]
}
ЗМІННІ СЕРЕДОВИЩА
Змінну AWKPATH може бути використано для вказівки списку каталогів, в яких gawk шукатиме файли, вказані опцією -f або --file.
Якщо в середовищі існує змінна POSIXLY_CORRECT, gawk поводитиметься так, ніби на командному рядку було вказано опцію --posix. Якщо одночасно вказано опцію --lint, то gawk видасть попередження про сумісність з POSIX.
ДИВІТЬСЯ ТАКОЖ
?egrep(1), getpid(2), ?getppid(2), ?getpgrp(2), ?getuid(2), ?geteuid(2), ?getgid(2), ?getegid(2), ?getgroups(2)
The AWK Programming Language, Alfred V. Aho, Brian W. Kernighan, Peter J. Weinberger, Addison-Wesley, 1988. ISBN 0-201-07981-X.
GAWK: Effective AWK Programming, Edition 3.0, видана Free Software Foundation, 2001.
ВАДИ
Опцію -F не обов'язково вказувати на командному рядку. Вона підтримується лише для сумісності.
Короткі програми, які містять синтаксичні помилки, схильні переповнювати стек обробки, що призводить до малозмістовних повідомлень. Доволі складно діагнозувати такі програми, і зусилля, витрачені на це не варті того.
АВТОРИ
Оригінальна версія UNIX awk була розроблена і реалізована Alfred Aho, Peter Weinberger і Brian Kernighan у Bell Laboratories. Brian Kernighan продовжує підтримувати і покращувати її.
Paul Rubin і Jay Fenlason від Free Software Foundation, написали gawk, сумісну з оригінальною версією awk, що ввійшла до складу UNIX 7-го видання. John Woods виправив ряд помилок. David Trueman разом з Arnold Robbins зробили gawk сумісним з новою версією UNIX awk. На сьогодні підтримка здійснюється Arnold Robbins.
Перший порт для DOS здійснено Conrad Kwok і Scott Garfinkle. Підтримка версії для DOS на дану мить здійснюється Scott Deifik. Pat Rankin переніс програму на VMS, Michal Jaegermann - на Atari ST. Портування для OS/2 було здійснене Kai Uwe Rommel спільно з Darrel Hankerson. Fred Fish забезпечив підтримкою Amiga, Stephen Davies переніс на Tandem і Martin Brown - на BeOS.
ІНФОРМАЦІЯ ПРО ВЕРСІЮ
Ця сторінка описує gawk версії 3.1.5.
ПОВІДОМЛЕННЯ ПРО ВАДИ
Якщо ви знайшли помилку в gawk, надішліть будь ласка повідомлення про неї на bug-gnu-utils@gnu.org. Вкажіть версію вашої операційної системи, версію gawk, компілятора C, який використовувався для збірки, а також тест програми та мінімальні дані, потрібні для відтворення помилки.
Перед тим, як вислати повідомлення про ваду, будь ласка зробіть дві речі. По-перше, впевніться, що у вас встановлена останню версія gawk. Багато помилок (звичайно малопомітних) виправляються в кожній новій версії і, можливо, вашу проблему вже була вирішено. По-друге, уважно прочитайте цей посібник, а також ті, посилання на які ви знайдете в ньому, щоб бути певним, що це дійсно помилка, а не примха мови.
Щоб ви не робили, НЕ посилайте повідомлення про помилку в comp.lang.awk. Хоч розробники gawk час від часу читають цю конференцію, дописи про помилки не є надійним способом повідомлення. Замість цього, скористайтеся з вищенаведених адрес електронної пошти.
Якщо ви користуєтесь GNU/Linux або BSD-системою, можливо має зміст відправити доповідь про помилку виробнику вашого дистрибутиву. З цим усе гаразд, але переконайтеся, що ви додали також копію офіційної електронної адреси, оскільки немає гарантії, що ваду передадуть утримувачу gawk.
ПОДЯКИ
Brian Kernighan з Bell Laboratories за надання цінної допомоги під час тестування та налагодження.
АВТОРСЬКІ ПРАВА
Copyright (c) 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
Permission is granted to make and distribute verbatim copies of this manual page provided the copyright notice and this permission notice are preserved on all copies.
Permission is granted to copy and distribute modified versions of this manual page under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.
Permission is granted to copy and distribute translations of this manual page into another language, under the above conditions for modified versions, except that this permission notice may be stated in a translation approved by the Foundation.