Scroll to navigation

gawk(1) 2007-10-27-16:31 gawk(1)

НАЗВА

gawk - мова пошуку й обробки зразків

СИНТАКСИС

gawk [ опції POSIX або GNU ] -f програмний_файл [ -- ] файл ...

gawk [ опції POSIX або GNU ] [ -- ] текст_програми файл ...

pgawk [ опції POSIX або GNU ] -f програмний_файл [ -- ] файл ...

pgawk [ опції POSIX або GNU ] [ -- ] текст_програми файл ...

ОПИС

Gawk - це GNU втілення мови програмування AWK. Вона відповідає визначенню мови, даному в Стандарті Команд, Мов і Знаряддь POSIX 1003.2 (Command Language And Utilities Standard). Цей стандарт, у свою чергу, заснований на книзі "Мова прогамування AWK" (The AWK Programming Language), Aho, Kernighan і Weinberger. Крім того, у gawk внесені деякі додаткові можливості, що з'явилися у версії awk для UNIX System V Release 4. Підтримуються також пізніші розширення awk, запропоновані Bell Laboratories, а також деякі розширення 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 розуміє наступі опції (у алфавітному порядку).


Використовувати fs як розділювач полів (значення вбудованої змінної FS).


--assign змінна=значення
Присвоїти перед виконанням програми значення змінній. Такі змінні будуть доступними у блоці BEGINN програми AWK.


--file програмний_файл
Взяти текст програми з програмного_файлу, замість з першого аргументу командного рядка. Може бути вказано кілька опцій -f (або --file).


-mr NNN
Встановити різні обмеження пам'яті для значення NNN. Прапор f встановлює максимальну кількість полів, а r - максимальний розмір відрізку. Ці два прапорці і опцію -m було введено в дослідницькій версії Bell Labs UNIX awk. Вони ігноруються gawk, оскільки gawk не має попередньо-встановлених обмежень.


-W traditional
--compat
--traditional
Працювати у режимі сумісності. У цьому режимі gawk працює як UNIX awk. Розширення GNU не підтримуються. Використанню --traditional надається перевага перед іншими формами цієї опції. Додаткову інформацію ви знайдете нижче у розділі РОЗШИРЕННЯ GNU.


-W copyright
--copyleft
--copyright
Вивести коротку інформацію про авторські права GNU і вийти.


--dump-variables[=file]
Надрукувати відсортований список глобальних змінних, їхніх типів і останніх значень до файлу file. Якщо назву файлу не надано, gawк створить awkvars.out у поточному каталозі. Список всіх змінних є хорошим способом знайти типографічні функціями для певності що функції не використовують глобальні змінні, там де малися на увазі локальні.


--exec file
Схожа до -f, за винятком того, що цю опцію буде оброблено останньою. Це повинно використовуватися зі #! скриптами CGI, щоб запобігти передаванню інших опцій або коду командного рядка з URL. Ця опція також унеможливлює надання значення змінним з командного рядка.


--gen-po
Сканує і аналізує програму AWK, створюючи файл GNU .po формату на стандартному виводі, з входженнями для ланцюжків тексту, що можуть бути локалізованими у програмі. Сама програма не виконується. Дивіться дистрибуцію GNU gettext для додаткової інформації про файли .po.


-W usage
--help
--usage
Вивести коротеньку довідку про опції і вийти з успішним статусом.


--lint[=аргумент]
Видасть попередження про наявність сумнівних або несумісних з іншими втіленнями AWK конструкцій. Разом з необов'язковим аргументом fatal, призводить до фатальної помилки. Це, можливо радикально, але його використання сприяє розробці чистішого коду AWK. Разом з необов'язковим аргументом invalid, тільки попередження про справді нечинні речі буде виведено.


--lint-old
Видавати попередження про наявність конструкцій, несумісних зі старими версіями UNIX awk.


--posix
Увімкнути режим сумісності з наступними обмеженнями:


* Екрануючі послідовності \x не розпізнаватимуться.
* Якщо значення FS - один пробіл, то роздільниками вважаються тільки пробіл ісимвол табуляції. Символ нового рядка роздільником не вважається.
* Ви не зможете додавати рядки після ? та :.
* Не розпізнається синонім func ключового слова function.
* Оператори ** і **= не використовуються замість ^ і ^=.
* Недоступна функція fflush().


--profile[=file]
Посилати профілюючі дані до file. За замовчуванням - awkprof.out. Коли використовується з gawk, профіль виглядатиме просто як "гарненько видрукуваний" програмний текст. Якщо використовується з pgawk, профіль втримуватиме номер виконання кожного виразу з лівого боку і число викликів кожної, означеної користувачем, функції.


--re-interval
Дозволити використання інтервальних виразів у регулярних виразах. (дивіться нижче). Інтервальні вирази традиційно були відсутні у мові AWK. Стандарт POSIX вніс їх для сумісності і одне з одним. Проте, їхнє використання може привести до помилок у роботі старих програм AWK, тому gawk розпізнає їх тільки, якщо надана ця опція або опція --posix.


--source текст_програми
Використовувати текст_програми як, власне, текст програми AWK. Ця опція дозволяє сполучати виклики бібліотечних функцій (підключаються через опції -f і --file) з вихідним кодом, що вводиться на командному рядку. Ця опція, в першу чергу, призначена для середнього і великого розміру програм AWK, використовуваних у скриптах оболонки.


--version
Вивести інформацію про версію вашої копії gawk. Ця опція може бути корисною, якщо ви хочете довідатися, чи не застарів gawk, встановлений на вашій системі, а також якщо ви хочете повідомити про помилку. (У відповідність з GNU Coding Standards, ці опції приводять до негайного виходу з можливості обробки аргументів, що починаються з "-", безпосередньо програмою AWK. Це відповідає угоді про обробку аргументів, використовуваній більшістю інших програм, сумісних зі стандартом POSIX.

У режимі сумісності всі інші опції вважаються невірними й ігноруються. У звичайному режимі, якщо вказано текст програми, невідомі опції передаються через масив ARGV програмі AWK для обробки. Це дуже зручно для запуску програм через "#!".

ВИКОНАННЯ ПРОГРАМИ 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.) Присвоювання значень способу розподілу вхідного потоку на поля і відрізки. Крім того, воно придатне в тих випадках, коли потрібно обробити кілька разів той самий файл.

Якщо значення одного з елементів 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:


Кількість аргументів командного рядка (за виключенням опцій gawk і назви файлу вихідного тексту програми).


Індекс масиву ARGV, що вказує на оброблюваний у даний момент файл.


Масив аргументів командного рядка. Індекс масиву може приймати значення від 0 до ARGC - 1. Змінюючи значення ARGV, можна контролювати, які файли оброблятимуться.

На несумісних з POSIX системах, вказує використання "бінарного" стану для всіх операцій вводу-виводу над файлами. Числові значення 1, 2 або 3 визначають чи це стосується вхідних файлів, файлів виводу чи всіх файлів, відповідно. Букви "r" (read) або "w" (write) також означають файли вводу або виводу, тоді як "rw" або "wr" - всі. Будь-яке інше значення розглядатиметься як "rw".


Формат перетворення чисел. За узгодженням, " %.6g".


Масив поточних значень змінних середовища. Масив індексовано назвами змінних, кожен елемент містячи значення відповідної змінної (наприклад, ENVIRON["HOME"] може мати значення /home/arnold). Зміна вмісту цього масиву не впливає на значення змінних оточення, як їх бачать програми, що запускаються gawk за допомогою перенаправлення або функції system().


Якщо виникла системна помилка під час перенаправлення для getline, під час читання для getline, або ж під час виклику close(), те ERRNO буде містити ланцюжок опису помилки. Це опис піддається перекладу у не-англійських локалях.


Розділений пробілами, список довжин полів. Якщо цій змінній присвоюється нове значення, то gawk розділяє вхідні дані на поля фіксованої довжини, ігноруючи значення змінної FS.


Назва файлу, оброблюваного в даний момент. Якщо на командному рядку не було вказано жодного файлу, то значення FILENAME дорівнюватиме "-". У блоці BEGIN змінну FILENAME не визначено (хіба встановити її за допомогою getline).


Номер поточного відрізку в поточному файлі вводу.


Роздільник полів у вхідному потоці (field separator), за замовчуванням пробіл. Дивіться розділ Поля вище.


Керує залежністю всіх регулярних виразів і ланцюжкових операцій від регістра. Якщо значення IGNORECASE не дорівнює нулеві, тоді регістр буде ігноровано у порівнюванню ланцюжків і регулярних виразах з ~ і !~, у вбудованих функціях 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 зсередини програми AWK.


Кількість полів у поточному відрізку (number of fields).


Загальна кількість відрізків (number of records), зустрінутих до даного моменту.


Формат виводу чисел (output format). За узгодженням, "%.6g".


Розділювач полів виводу (output field separator). За узгодженням, пробіл.


Розділювач відрізків виводу (output record separator). За узгодженням, символ нового рядка.


Члени цього масиву надають загальну інформацію про обіг програми AWK. На деяких системах, це можуть бути елементи group1 по "groupn", де n буде номером додаткових груп процесу. Використайте оператор in щоб виявити ці елементи. Наступні елементи гарантовано присутні на вашій системі:

PROCINFO["egid"] Значення системного виклику getegid(2).
PROCINFO["euid"] Значення системного виклику geteuid(2).
PROCINFO["FS"] Містить ланцюжок "FS", якщо відбувається розділення полів за допомогою FS, i "FIELDWIDTHS", якщо відбувається розділення полів через FIELWIDTHS.
PROCINFO["gid"] Значення системного виклику getgid(2).
PROCINFO["pid"] ID процесу.
PROCINFO["ppid"] ID батьківського процесу.
PROCINFO["uid"] Значення системного виклику getuid(2).
PROCINFO["version"] Версія програми gawk. Цю змінну додано, починаючи з gawk 3.1.4.


Розділювач відрізків вводу (record separator). Типово, символ нового рядка.


Вказувач кінця відрізку (record terminator). Gawk присвоїть RT значення вхідного тексту, що збіглося з символом або регулярним виразом, вказаним у RS.


Індекс першого символу, що збігся після виклику match(). 0, якщо збігу не було. (Це також означає що індекси символів почнуться з 1.)


Довжина ланцюжка, що збіглася після виклику match(). -1, якщо збігу не відбулося.


Символ, використовуваний для поділу індексів у масиві. Типово, "\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]
перебирання всіх елементів масиву (ітерації).

Певний елемент може бути вилучено з масиву оператором 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(), що також будуть числовими ланцюжками. Ідея полягає в тім, що в такий спосіб розглядається лише ввід користувача, що виглядає, як число.

Неініційовані змінні, якщо звернутися до них, матимуть Починаючи з 3.1 версії gawk, ви можете використовувати вісімкові і шіснадцяткові константи схожі на ті, що використовуються у C, у ваших програмах AWK. Так, наприклад, вісімкове значення 011 дорівнюватиме десятковому 9, тоді як шіснадцяткове 0x11 дорівнюватиме 17.

Ланцюжкові константи

Ланцюжкові константи, або сталі, у AWK - це послідовності знаків, включених у подвійні лапки ("). Всередині ланцюжків розпізнаються певні екрановані послідовності, так само як і у C. А саме:

\\

Буквальний зворотній слеш.


Знак "alert" (тривога). Як правило, це знак BEL (дзвоник) набору символів ASCII.


Знак повернення (відступу назад).


Знак подання бланка (сторінки).


Знак нового рядка.


Знак повернення каретки.


Знак кроку табуляції.


Знак вертикального кроку табуляції.


Знак, що буде передано через шістнадцяткове число, що стоїть після \x. Так само, як і в ANSII C, включені шістнадцядкові числа вважаються частиною екранованої послідовності. Наприклад, "\x1B" відповідає ESC (знак перемикання коду) набору символів ASCII.


Знак, що буде передано через одно, двох або трьох-значне вісімкове число. Наприклад, "\033" відповідає ESC (знак перемикання коду) набору знаків ASCII.


Буквальний знак c.

Екрановані послідовності також можуть використовуватись всередині регулярних виразів (наприклад, /[ \t\f\n\r\v]/ співпадатиме з знаками пробілів).

У стані сумісності, знаки, що передано як вісімкові або шістнадцяткові екрановані послідовності розглядаються буквально при використанню у сталих регулярних виразів. Тобто, /a\52b/ рівнозначно /a\*b/.

ШАБЛОНИ І ДІЇ

AWK - це рядково-зорієнтована мова. Спершу вказується шаблон (порівнюється з відрізками), потім відповідна дія. Оператори дії включено у фігурні дужки { і }. Шаблон або дія можуть бути відсутніми, але, зрозуміло, не те й інше одночасно. Якщо не вказано шаблон, то дія виконуватиметься для кожного вхідного відрізку. Пропущена ж дія рівнозначна виразу

{ 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. Вони складаються з наступних символів:


збігається з не-метасимволом c.

збігається з буквальним символом c.
.

збігається з будь-яким символом, включаючи символ нового рядка.
^

збігається з початком рядка.
$

збігається з кінцем рядка.
[abc...]

список символів, збігається з будь-яким одним символом з abc....
[^abc...]

негативний список символів, збігається з будь-яким символом, крім abc....

чергування: збігається або з r1, або з r2.

зчеплення: збігається спершу з r1, потім з r2.

збігається з одним або більше r.

збігається з нуль або більше r.

збігається з нуль або одним r.
(r)

групування: збігається з r.

r{n,}
r{n,m}
Одне або два числа у фігурних дужках позначають інтервальний вираз. Якщо в дужках вказане одне розділених комою, то r повинен повторюватись від n до m раз. Якщо вказано тільки одне з комою, то r повторюється, щонайменше, n разів. Інтервальні вирази можна використовувати, лише якщо на командному рядку було вказано або опцію --posix, або --re-interval.

збігається з порожнім ланцюжком на початку або наприкінці слова.

збігається з порожнім ланцюжком у слові.
\<

збігається з порожнім ланцюжком на початку слова.
\>

збігається з порожнім ланцюжком наприкінці слова.

збігається з будь-яким символом "слова" (буква, цифра або твердий пробіл).

збігається з будь-яким символом, крім тих що складають "слово".
\`

збігається з порожнім ланцюжком на початку буфера.
\'

збігається з порожнім ланцюжком наприкінці буфера.

Всі екрануючі послідовності, дійсні у ланцюжкових константах (дивіться нижче), можуть вживатися також у регулярних виразах.

Класи символів - нова риса, привнесена стандартом 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=]] - це регулярний вираз, що збігається з e, Є і e`.

Ці можливості дуже важливі в не-англійських локалях. Бібліотечні функції, використовувані gawk для роботи з регулярними виразами, у даний момент розпізнають тільки класи символів POSIX. Вони не розпізнають символи сортування і класи еквівалентності.

Оператори \y, \B, \<, \>, \w, \W, \` й \', притаманні gawk, являються розширеннями, основаними на можливостях бібліотек регулярних виразів GNU.

Різноманітні опції командного рядка також визначають, як gawk інтерпретує символи, що складають регулярні вирази.

без опцій

Типово, gawk надає всі можливості регулярних виразів POSIX і розширень GNU, як описано вище. Не підтримуються лише інтервальні вирази.


Підтримуються лише регулярні вирази POSIX, оператори GNU не мають спеціального значення. (Наприклад, \w відповідає буквальній літері w). Інтервальні вирази дозволено.


Використовуються традиційні регулярні виразу Unix awk. Оператори GNU не мають спеціального значення, інтервальні вирази не підтримуються, так само класи символів POSIX ([[:alnum:]] і т.д. ) не підтримуються. Символи, вказані за допомогою вісімкової або шістнадцяткової екранованої послідовності, сприймаються буквально, навіть якщо вони являють собою метасимволи регулярних виразів.


Дозволяє використовувати інтервальні вирази, навіть якщо вказано опцію --traditional.

Дії

Твердження дії включаються у фігурні дужки { й }. Твердження дії можуть складатися з звичайних виразів присвоювання, умовних виразів і циклів, які ви зустрінете в багатьох інших мовах. Оператори, контрольні структури і вирази вводу/виводу схожі на подібні їм з мови C.

Оператори

У AWK визначено наступні оператори, у порядку зменшення пріоритету:

$

Посилання на поле.

++ --

Інкремент і декремент, обидва можуть бути префіксними і постфіксними.

^

Зведення в ступінь (можна також використовувати ** і **= з оператором присвоювання).

+ - !

Унарний плюс, унарний мінус і логічне заперечення.

* / %

Множення, ділення і рештка.

+ -

Додавання і віднімання.

пробіл

Зчеплення рядків.

< >

<= >=
!= ==
Звичайні операції порівнювання.

~ !~

Збіг і заперечення збігу з регулярним виразом. Примітка: не використовуйте сталий регулярний вираз (/foo/) ліворуч від ~ або !~, тільки праворуч. Вираз /foo/~ expr має те саме значення, що й (($0 ~ /foo/) ~ expr). Звичайно, це не те, що малося на увазі.


Існування в масиві.

&&

Логічне І.

||

Логічне АБО .

?:

Умовний вираз C. Він має вигляд вираз1 ? вираз2 : вираз3. Якщо вираз1 є істиною, то результатом буде значення виразу2, у протилежному випадку - виразу3. Обчислюється лише один з виразу2 або виразу3.

= += -=

*= /= %= ^=
Присвоювання. Підтримується як просте присвоєння (змінна=значення), так і присвоювання за допомогою складених операторів.

Керування потоком

Операторами керування потоком є:


if (умова) твердження [ else твердження ]
while (умова) твердження
do твердження while (умова)
for (вираз1; вираз2; вираз3) твердження
continue
delete масив[індекс]
delete масив
exit [ вираз ]
{ твердження }

Виразиi вводу/виводу

Твердженнями вводу/виводу є наступні:


Закрити файл, канал або співпроцес. Опція як повинна вживатися лише у випадку закриття одного кінця двостороннього каналу або процесу. Це повинно бути ланцюжком "to" або "from".


Надасть $0 значення наступного прочитаного відрізку. Встановить NF, NR, FNR.


Надасть $0 значення наступного відрізку файлу. Встановить NF.


Надасть змінній значення наступного відрізку. Встановить NR, FNR.


Надасть змінній значення наступного відрізку з файлу.

команда | getline [змінна]

Виконати команду, передаючи її вивід або $0, або змінній.

команда |& getline [змінна]

Виконати команду як співпроцес, передаючи її вивід $0 або змінній. Співпроцеси є розширенням gawk.


Припинити обробку поточного вхідного відрізку. Прочитати наступний вхідний відрізок і почати його обробку з самого початку, з першого шаблону програми AWK. Якщо досягнуто кінця вхідних даних, блок(и) END буде виконано, якщо є такі.


Припинити обробку поточного вхідного файлу. Наступний вхідний відрізок буде прочитано з наступного вхідного файлу. FILENAME і ARGIND оновлюються, FNR перезаладоване до 1 і обробка починається з першого шаблону програми AWK. Якщо досягнуто кінця вхідних даних, то буде виконано закінчується вмістом змінної ORS.


Вивести вирази. Вирази розділено вмістом змінної OFS. Вивід відрізку закінчується вмістом змінної ORS.


Вивести вирази до файлу. Вирази розділено вмістом змінної OFS. Вивід відрізку закінчується вмістом змінної ORS.


Форматувати і вивести.


Форматувати і вивести до файлу.


Виконати оболонкову команду, і повернути код її виходу. (Може не працювати на не-POSIX системах.)


Звільнити буфери, зв'язані з відкритим для виводу файлом або каналом файл. Якщо файл не вказано, відбувається звільнення буферу стандартного виводу. Якщо файл вказано як порожній ланцюжок, то відбувається скидання буферів усіх відкритих для виводу файлів і каналів.

Дозволені також додаткові перенаправлення вводу-виводу для print і printf:


Додасть виведені дані до файлу.


Передасть дані каналу.


Передасть дані співпроцесу.

Команда getline повертає 0 по досягненні кінця файлу і -1 при помилці. У випадку помилки, ERRNO міститиме рядок з описом помилки.

Зауваження: при використанні каналу або співпроцесу з getґ line або print чи printf всередині циклу, ви повинні використати close() для створення нових випадків команди. AWK не закриває автоматично канали або співпроцеси після повернення ними EOF (знак кінця файлу).

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-ний аргумент форматування у цьому місці. Це називається вказівником позиції і застосовується насамперед у перекладених версіях форматувальних ланцюжків, а не у оригінальних

-

Вираз вирівнюється вліво у своєму полі.

пробіл

Для числових перетворень, виводити перед додатковими значеннями пробіл, а перед від'ємними - знак мінуса.

+

Знак плюс перед параметром ширини (дивіться нижче), вказує завжди виводити знак для числових перетворень, навіть якщо форматовані дані мають додаткове значення. + пересилює вказівника простору.

#

Використовувати "альтернативну форму" для деяких літер форматів. Для %o - вивести спереду нуль. Для %x і %X - вивести спереду 0x або 0X, якщо результат відмінний від нуля. Для %e, %E і %f - результат завжди буде містити десяткову точку. Для %g і %G - кінцеві нулі не будуть прибрані.

0

Передуючий 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 має наступні вбудовані математичні функції:


повертає арктангенс y/x у радіанах.


повертає косинус виразу, вираз повинен бути в радіанах.


експонентна функція.


відкидає дробову частину.


функція натурального логарифма.


повертає випадкове число N між 0 і 1, тобто 0 < N < 1.


повертає синус виразу. Вираз повинен бути в радіанах.


функція квадратного кореня.


встановлює вираз як нове зерно для генератора випадкових чисел. Якщо вираз не вказано, то використовується поточний час. Значення, що повертається, дорівнює попередньому зерну генератора випадкових чисел.

Ланцюжкові функції

Gawk має наступні вбудовані ланцюжкові функції:


Повертає кількість елементів вихідного масиву s. Елементи s сортовані, використовуючи звичайні правила gawk порівнювання значень. Індекси відсортованих значень заміняються послідовністю цілих чисел, починаючи з 1. Якщо буде вказаний додатковий масив залишаючи індекси джерельного масиву s незмінними.


Повертає кількість елементів вихідного масиву s. Поведінка нагадує ту, яку ми спостерігаємо в asort(), за винятком того, що індекси масиву використовуються для сортування, а не значення елементів масиву. Після закінчення, масив буде індексовано десятковими числами, кожний елемент зі значенням попереднього індексу. Старі значення масиву відкидаються, тож додайте другий масив, якщо хочете зберегти оригінальний.


Шукає в рядку t збіги з регулярним виразом r. Якщо h є ланцюжком, що починається з g або G, то замінює всі збіги r на s. У протилежному випадку, h буде числом, що вказуватиме, який по рахунку збіг r замінити. Якщо t не вказано , то використовується $0. У тексті заміни s, послідовність \n, де n - це цифра від 1 до 9, може бути використаною для посилання на текст n-нної, включеної в дужки, частини виразу. Послідовність \0 посилається на весь текст, що збігся, так само символ &. На відміну від sub() і gsub(), змінений ланцюжок буде повернуто як результат функції, а оригінальний вихідний ланцюжок залишається незмінним.


Кожна частина ланцюжка t, що збіглася з регулярним виразом r, замінюється на ланцюжок s і повертається кількість здійснених замін. Якщо t не вказаний, то використовується $0. Місце & у тексті заміни s візьме ланцюжок, що збігся. Для виводу буквального символу & використовуйте \& (це повинно виглядати як "\\&"). (Для подальшої дискусії стосовно & і \ у тексті заміни у sub(), gsub() і gensub(), зверніться до "GAWK: Effective AWK Programming".)


Повертає індекс ланцюжка t у ланцюжку s, або 0, якщо t не знайдено. (Це також означає, що відлік індексів знаків починається з 1.)


Повертає позицію в s, де відбулося співпадання з регулярним виразом r, або 0, якщо співпадання з r не відбулося. Встановлює значення RSTART і RLENGTH. Зауважте, що послідовність аргументів є тією самою, що й для оператора ~, тобто ланцюжок ~ regex. Якщо додатково вказати масив a, його буде очищено, після чого елементи з 1 по n заповнено частинами s, що співпадають з відповідними, взятими в дужки, частинами виразу r. Елемент з індексом 0 в a утримуватиме ту частину s,що співпала з цілим регулярним виразом r. Елементи, індексовані як a[n, "start"] і a[n, "length"] надають інформацію про перший індекс у ланцюжку і довжину кожної частини ланцюжка, що співпала.


Розбиває рядок s, керуючись регулярним виразом r, зберігає результат у масив a і повертає кількість полів. Якщо r не вказано, то використовується FS. Масив a попередньо очищається. Функція працює подібно до поділу на поля, описаного вище.


Виводить список виразів відповідно до формату fmt.


Схожа до gsub(), але замінюється тільки перша частина ланцюжка, що співпала з r.


Повертає n-символьну частину ланцюжка s, починаючи з і. Якщо n не вказати, то повертається залишок рядка s.


Повертає копію ланцюжка, у якій всі символи верхнього регістру, переведені у відповідні їм символи нижнього регістру. Не-алфавітні символи залишаються без змін.


Повертає копію ланцюжка, у якій усі символи нижнього регістру, переведені у відповідні їм символи верхнього регістру. Не-алфавітні символи залишаються без змін.

Функції роботи з часом

Оскільки одним з основних застосувань програм AWK являється обробка журнальних файлів, що містять мітки часу, gawk надає декілька функцій для отримання і форматування міток часу .


Перетворює формат у мітку часу схоже до systime(), наведеної нижче. Формат є ланцюжком у формі YYYY MM DD HH MM SS [DST]. Вміст ланцюжка повинен складатись з шести або семи чисел, що відповідатимуть, відповідно: повному запису року, місяцю від 1 до 12, даті від 1 до 31, годині від 0 до 23, хвилині від 0 до 59, секунді від 0 до 60 і, необов'язковій, вказівці літнього часу. Значення цих чисел не обов'язково повинні бути в межах, вказаних вище, наприклад, година -1 означатиме одну годину до півночі. Час обчислюється за нуль-основаним Григоріанським календарем. Припускається, що це час місцевого часового поясу. Якщо прапорець літнього часу додатковий, вважатиметься, що це літній час, у протилежному випадку, що це стандартний час. У випадку від'ємного значення, mktime() намагається сама визначити чи вказаний час є літнім, чи ні. Якщо формат містить недостатньо елементів, або якщо обчислений час не є дійсним, mktime() повертає -1.


Форматує час відповідно до вказаного формату. Час повинен бути у тій самій формі, що повертається systime(). Якщо час не вказано, то використовується поточний час. Якщо не вказано формат, то використовується формат за замовчуванням, еквівалентний виводові date(1). Для гарантії правильності використовуваних форматів, зверніться до специфікації функції strftime() ANSI C. Вільно розповсюджувана версія strftime(3) і відповідна сторінка посібника до неї поставляються з gawk. Якщо ця версія використовувалась для збірки gawk, то всі формати, описані в посібнику, будуть доступні програмі gawk.


Повертає поточний час у вигляді кількості секунд із початку Epoch (північ UTC, 1 січня 1970 року, на системах POSIX).

Функції побітових операцій

Починаючи з версії 3.1 gawk, з'явилися додаткові функції по обробці бітів. Їхня дія полягає у перетворенні чисел з плаваючої точкою подвійної точності у беззнакові довгі (unsigned long) цілі, здійснення операцій, після чого and(v1, v2) Повертає порозрядне І значень v1 і v2.


Повертає порозрядне доповнення значення val.


Повертає значення val, зсунутого вліво на count бітів.


Повертає порозрядне АБО значень v1 і v2.

rshift(val, count) Повертає значення val, зсунутого вправо на count бітів.


Повертає порозрядне XOR значень v1 і v2.

Функції інтернаціоналізації

Починаючи з gawk 3.1, можна використовувати наступні функції для перекладу ланцюжків під час обігу програми. Для повного опису дивіться "GAWK: Effective AWK Programming".


Вказує каталог directory, де gawk шукатиме файли з закінченням .mo, у випадку, якщо вони не були або не можуть бути розміщеними у "стандартні" місцезнаходження. Вона повертає теку, до якої "прив'язано" домен domain. Домен з узгодженням вказується у змінній TEXTDOMAIN . Якщо теку вказано як порожній рядок (""), тоді bindtextdomain() повертає поточну "прив'язку" для даного домену.


Повертає переклад ланцюжка s у текстовому домені domain і категорії локалі category. Стандартним значенням для домену буде значення змінної TEXTDOMAIN. Стандартним значенням категорії - "LC_MESAGES". Якщо ви хочете поміняти категорію, впевніться що вона відповідає одній з дійсних категорій локалі, описаних у "GAWK: Effective AWK Programming". Ви також повинні вказати текстовий домен. Використайте TEXTDOMAIN для вживання поточного домену.


Повертає форму множини ланцюжків s1 і s2, що відповідає числу n, згідно з текстовим доменом domain і категорією локалі category. Стандартним значенням для домену буде значення змінної TEXTDOMAIN для вживання поточного домену.

ФУНКЦІЇ КОРИСТУВАЧА

Функції в 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".


Динамічно завантажити спільний об'єкт object і викликати функцію function з цього об'єкту, для ініціалізації. Обидва параметри повинні бути надано як ланцюжки. Повертає значення, повернуте функцією function.

Ця функція описана у GAWK: Effective AWK Programming", але все, що стосується цієї можливості, може помінятись у наступному релізі. Ми радимо уникати цієї риси там, де ви не хочете міняти код пізніше.

СИГНАЛИ

pgawk розпізнає наступні два сигнали:


Викличе викид стеку профілю і викликів функцій у файл профілю awkprof.out або той що було вказано зкомандного рядка опцією --profile. Програма після цього продовжить свою роботу.


Викличе викид стеку профілю і викликів функцій і припинить роботу програми.

ПРИКЛАДИ

Вивести і відсортувати назви всіх користувачів:


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 передуючим знаком твердого пробілу ("_"). Наприклад:


gawk BEGIN { print hello, world }
завжди виведе hello, world. Зате,


gawk BEGIN { print _"hello, world" }
може видрукувати "bonjour, monde" у Франції.

Існує декілька кроків, які необхідно зробити для створення і запуску локалізованої програми AWK.

1. Додайте дію у BEGIN, яка надасть значення змінній TEXTDOMAIN, що буде асоційоване з назвою вашої програми.


BEGIN { TEXTDOMAIN = myprog }
Це дозволяє gawk знайти файли .mo, що вживатимуться з цією програмою. Без цієї вказівки, gawk використовує текстовий домен messages, який ймовірно не міститиме переклади для вашої програми.

2. Помітьте всі ланцюжки, які ви хочете бути перекладеними, передуючим твердим пробілом.

3. Якщо необхідно, використайте функції dcgettext() або bindtextdomain() у програмі, як було описано вище.

4. Виконайте gawk --gen-po -f myprog.awk > myprog.po для створення файлу .po для вашої програми.

5. Перекладіть згенерований файл .po, після чого створіть відповідний файл .mo і інсталюйте його. Це в загальних рисах. Повний опис цієї процедури ви знайдете у "GAWK: Effective AWK Programming".

СУМІСНІСТЬ З POSIX

Основна мета gawk - це сумісність як зі стандартом POSIX, так і з останніми версіями awk для UNIX. Для цього gawk стандарт 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() не тільки без аргументу, але й без дужок. Тобто,


a = length # Holy Algol 60, Batman!
є тим самим, що й


a = length()
a = length($0)
Цю можливість помічено як застарілу у стандарті POSIX, і gawk з опцією --lint видаватиме попередження про це. 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().
* Локалізовані ланцюжки.
* Динамічне додання нових вбудованих функцій завдяки 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.

ДИВІТЬСЯ ТАКОЖ

egrep(1), getpid(2), getppid(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, що ввійшла до складу Seventh Edition UNIX. 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 ╘ 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.

---- Переклад украінською здійснив Віталій Цибуляк <tech@oboz.com.ua>.

2007-10-27-16:31 © 2005-2007 DLOU, GNU FDL