- 1.2.1 Стандартні змінні
- 1.2.2 Значення змінних
- 1.2.3 Змінні поля
- 1.2.4 Масиви
- 1. Порахувати кількість рядків (input)
- 3. Надрукувати всі рядки, що містять "olga", "mike" або "mal"
- 4. Надрукувати третє поле кожного рядка
- 5. Надрукувати спочатку третє, а потім друге поля кожного рядка
- 6. Додати рядки, що містять "olga", "mike" або "mal" відповідно до файлів: folga, fmike, fmal
AWK - утиліта призначена для простих, механічних і обчислювальних маніпуляцій над даними. Досить нескладні операції часто необхідно виконати над цілими пакетами файлів, а писати для цього програму на одному із стандартних мов програмування є виснажливим і, як правило, не дуже простою справою. Оптимальне рішення проблеми - використання спеціальної утиліти AWK, що включає в себе не громіздкий і зручний мову програмування, що дозволяє вирішувати завдання обробки даних за допомогою коротких програм, що складаються з двох-трьох рядків.
Утиліта AWK спочатку об'єднувала властивості утиліт UNIX - sed і grep. Надалі її можливості значно розширилися. Утиліта AWK була створена в 1977р, американськими авторами: Alfred V.Aho, Brian W.Kernighan і Peter J.Weinberger.
AWK сканує input (стандартний або вказується набір файлів), і над рядками, що задовольняють заданим зразком, виконує вказані дії. Рядок може містити максимально до 256 символів.
формат:
AWK [-Fc] [-f file] [files]
AWK [-Fc] [prog] [files]
prog - програма, виду: 'зразок $ {$ дію $} $'
file - файл з AWK -програма:
зразок {дію}
зразок {дію}
...
files - файли, призначені для AWK -оброблення.
-Fc - встановлює роздільник полів в "с" (Див. 1.2.1 і 2.4)
1. Мова програмування AWK допускає використання:
- полів;
- Змінних (Стандартних, Масивів);
- Арифметичних виразів.
2. Зразок:
- Регулярний вираз;
- Вираз відносини;
- Комбінація зразків;
- BEGIN і END.
3. Дія:
- Послідовність пропозицій, розділених ''; '' Або '' \ n '' (новий рядок)
Речення:
- Висновок (Друк);
- Присвоєння;
- Вбудована функція;
- Керуюча структура.
Кожна сканована рядок input розглядається як що складається з полів, розділених розділовими символами (за замовчуванням - пробіл).
На поля можна посилатися з AWK програми наступним чином:
- $ 1 - Перше поле;
- $ 2 - Друге поле;
- ... і так далі...
- $ 0 - Посилається на весь рядок цілком.
Рядок може містити максимально до 100 полів.
1.2.1 Стандартні змінні
$ 0- адресує всю запис цілком $ n - адресує n -е поле в записі ARGC - кількість аргументів командного рядка ARGV - масив аргументів командного рядка CONVFMT - формат внутрішнього перетворення число - & gt рядок ENVIRON - масив змінних середовища FILENAME - ім'я файлу, що обробляється AWK в зараз FNR - номер запису в поточному файлі FS - роздільник полів у записі IGNORECASE - якщо ця змінна не порожня, то все порівняння AWK проводить, ігноруючи відмінність регістрів NF - кількість полів в поточному записі NR - номер поточного запису OFMT - формат виведення для виведення OFS - роздягли ялина полів при виведенні ORS - роздільник записів при виведенні RLENGTH - довжина збігу, знайденого командою match RSTART - положення першого збігу, знайденого командою match SUBSEP - символ-роздільник для індексів масивів
1.2.2 Значення змінних
Змінні можуть інтерпретуватися як числові або строкові. Вони приймають значення в залежності від контексту, наприклад:
x = 1, x сприймається як число;
x = "", x - рядок;
x + "abc" - результат операції інтерпретується як число незалежно від того, чи було х числом або рядком. Якщо рядок не може бути інтерпретована як число ( "abc"), то її значення стає 0.
Рядок може містити максимально до 256 символів.
наприклад:
box = "4" (присвоюємо box значення рядка 4)
box = box * 4 (box отримала значення 16, але вже не як рядок, а як число)
box = box "коробок цукерок" (наша змінна box є строковою зі значенням "16 коробок цукерок")
Взагалі AWK в стані при перетворенні рядка в число розпізнати такі рядки: "100", "1n00", "100fg" як число 100.
1.2.3 Змінні поля
Посилання на поля $ 1, $ 2, ... можуть інтерпретуватися як змінних, наприклад:
$ 1 = "3" + $ 2 - перше поле приймає значення другого поля, збільшеного на 3.
$ (i + 1) - інтерпретується як поле, номер якого залежить від значення змінної i.
1.2.4 Масиви
Допускається використання масивів. Масиви не з'являються, а приймають значення з контексту, наприклад:
x [NR] = $ 0 - елементу масиву x, індексувати NR , Присвоюється обробляється рядок.
x [ "apple"] - елементи масиву можуть індексуватися НЕ числовим значенням, тобто рядком.
вираз:
- Мінлива;
- число;
- рядок;
- Вбудована функція;
- Вираз & lt Операція & gt вираз.
& lt Операція & gt: "+", "-", "*", "/", "%"
Для здійснення пошуку в AWK мовою допускається використання регулярних виразів, укладених в '' / / ''. Доповнення до використання регулярних виразів, яких припускаються в AWK -мови: "()" - Дужки допускаються для групування; "|" - Вказівка альтернативи "або"; "+" - Плюс, стоїть за регулярним виразом означає будь-яку послідовність входжень цього виразу, починаючи з 1; "?" - Знак питання за регулярним виразом означає 0 або 1 входжень цього виразу; "[]" - описує безлічі одиничних символів. (Описують простим перерахуванням); "-" -використовується для завдання діапазону символів, відповідного таблиці кодів ASCII. "~" - тильда відповідає початку рядка (/ ~ A / відповідає рядкам починаються на А) "$" - знак долара відповідає кінцю рядка (/ A $ / відповідає рядкам закінчуються на А) "." - точка позначає довільний одиничний символ. "*" - як і + відповідає багатократному повторенню попереднього символу, але можливо і нульове входження "\" - скасовує спеціальне значення символу (\. Означає точку)
наприклад:
/ Olga / - Вказує на рядки, що містять Olga.
/ [Oo] lga | [Mm] ike | [Mm] al / - Вказує на рядки, що містять Olga або olga або Mike або mike або Mal або mal.
/ number [0-9] / - Вказує на рядки, що містять number0 або number1 або ... number9.
/\/.+\// - Вказує на рядки, що містять будь-яку кількість символів, більше або рівне 1, укладених в / /.
Вираз ставлення може бути двох типів:
- & lt Вираз & gt & lt Належність & gt & lt Вираз & gt
- & lt Вираз & gt & lt Лог. Операція & gt & lt Вираз & gt
Логічні операції
- логічне або - логічне і "||" "&&" "- менше, менше або дорівнює"> =,> "- більше або дорівнює, більше" == "- чисельне рівність або збіг рядків"! "- заперечення" ~ "- перевірка на вміст
наприклад:
$ 1 ~ / [Oo] lga / - Вказує на рядки, перше поле яких містить Olga або olga.
$ 1 & gt = "s" - Вказує на рядки, що починаються з символу s або наступних за ним по порядку: t, u, v ...
Допускається логічна комбінація зразків з використанням наступних знаків: || - '' або '', & amp & amp - '' і '',! - '' не " '.
Послідовності зразків, з'єднаних одним із знаків читаються зліва направо.
Комбінація: '' образец1, образец2 '' вказує, що дія виконується над рядками, що потрапляють в зазначений ранг: тобто, починаючи від рядка, що задовольняє '' образец1 "і аж до рядка, що задовольняє '' образец2", включаючи її саму.
наприклад:
/02\.95/ & amp & amp ($ 1! ~ /\.Su/ $ 2! ~ /\.Su/) - Вказує на рядки, що містять 02.95 і не мають .su одночасно в першому і в другому полі.
NR == 100, NR == 200 - Вказує рядки з номерами від 100 до 200.
Зразок BEGIN вказує на початок input або на ті дії, які повинні бути виконані до якого б то не було аналізу рядків. Зразок END вказує на кінець input або на ті дії, які повинні бути виконані після обробки всіх рядків.
наприклад:
BEGIN { FS = ":"} - Встановлює роздільник полів в ":" до початку обробки рядків. Еквівалентно опції "-F:" при AWK виклику.
END {print NR} - Друкує номер останнього рядка input, тобто кількість оброблених вхідних рядків.
За замовчуванням AWK читає з пристрою стандартного введення (клавіатура), однак може читати і підготовлений заздалегідь файл даних або конвеєрний висновок іншої програми. У рядку виклику AWK можна вказати кілька файлів даних, AWK буде послідовно їх обробляти. Ім'я поточного файлу введення доступно як значення змінної FILENAME Ці базові можливості AWK з введення даних можуть бути істотно розширені використанням функції (або команди) getline Використана без аргументів, getline просто читає чергову запис з поточного файлу введення. Це дозволяє, наприклад, спеціальним чином обробити наступний рядок, якщо ви, наприклад, виявили у вхідних даних повідомлення типу:
"TOP SECRET! NEXT LINE TO BE BURNED BEFORE READING"
Після виконання команди getline AWK продовжує нормальний цикл своєї діяльності, застосовуючи до цього запису наступні пари зразок - дії. Команда getline може бути використана для введення, значення строкової змінної:
getline message:
Ніяких побічних ефектів при цьому не відбувається, за винятком того, що змінюється лічильник записів NR . Команда getline може читати з пойменованого файлу, використовуючи техніку перенаправлення:
getline
Вираз file може бути довільним строковим виразом, яке інтерпретуються як ім'я файлу в даній операційній системі. Якщо getline не зустріла будь-яких проблем при виконанні, вона повертає значення 1. Якщо при виконанні виявлений кінець файлу, то повертається 0, якщо виявлена помилка, то повертається -1. В останньому випадку причину помилки можна знайти, проаналізувавши значення змінної ERRNO.
Формат оператора друку:
PRINT [& lt список виразів & gt] [& gt & lt вираження1 & gt]
Якщо в списку вираження знаходяться через кому (,), то значення цих виразів виводяться на output (друкуються) через символ-роздільник OFS (За замовчуванням пробіл).
Наприклад: команда print "Вася", "+", "Маша" видасть Вася + Маша.
Якщо ж вирази стоять через пробіл, то на друку відбувається їх конкатенація.
Значення & lt вираження1 & gt розглядається як ім'я файлу. Саме його присутність означає друк в файл. Якщо замість "& gt" коштує "& gt & gt", то це означає додавання до вже існуючого файлу. Можна використовувати в одній програмі максимально до 10 output файлів.
Оператор форматованої друку:
PRINTF формат [список виразів] [& gt вираження1]
формат: символьний рядок в подвійних лапках. Ідентичний формату, використовуваному в функції printf в мові '' С ''. Формат може містити:
- звичайні символи, вони копіюються на output.
- esc послідовності, що представляють неграфічні символи, наприклад, "\ n" - новий рядок.
- специфікації для виведення аргументів, вони слідують після символу ''% ''. Число специфікацій має дорівнювати числу аргументів. (Якщо воно менше числа аргументів, то зайві аргументи ігноруються, якщо ж більше - то це помилка).
Стандартні правила:
% s - рядок символів% d - десяткове число% f -вещественное число з десятковою крапкою% o - вісімкове число% x - шістнадцяткове число
Програма AWK допускає також і перенаправлення виводу в конвеєр. У цьому випадку оператор виведення має вигляд:
printf A, B, B, ... | CMD, де команда CMD може бути довільним строковим виразом. Значення цього виразу передається командному інтерпретатору операційної системи для виконання. Знову ж нагадаємо, що в AWK бажано після обробки одного файлу відразу ж його закрити, хоча AWK в змозі підтримувати 10 відкритих файлів.
Команди закриття:
close (filemane) - закриття файлу filename
close (command) - закриття конвеєра command
Оператор присвоювання має вигляд:
& lt змінна & gt = & lt вираз & gt
Початкове значення змінної 0 або "" (пробіл). Допускаються інші типи привласнення, відповідно до мови '' С '': "+ =", "- =", "* =", "/ =", "% =".
& lt змінна & gt ++, ++ & lt змінна & gt - збільшення значення змінної на 1.
& lt змінна & gt -, - & lt змінна & gt - зменшення значення змінної на 1.
atana2 ()
- арктангенс cos () - косинус exp (), log (), sqrt () - Математичні функції експонента, логарифм і квадратний корінь. gsub (s, t, u) - аналогічна sub, але замінює всі входження t index (s, t) - Повертає початкову позицію підрядка t в рядку s. (Або 0, якщо t в s не міститься.) Int () - Функція цілої частини числа. length (arg) - Функція довжини arg. Якщо arg не вказано, то видає довжину поточного рядка. match (s, t) - перевірка на наявність підрядка t в рядку s rand - псевдовипадкове число з інтервалу [0,1] split (s, array, sep) - поміщає поля рядка s в масив array і повертає число заповнених елементів масиву. Якщо вказано sep, то при аналізі рядка він розуміється як роздільник. sprintf (fmt, exp1, exp2, ...) - Здійснює форматований друк (висновок) в рядок, ідентично PRINTF. srand - ініціалізація випадкового датчика strtime (firmat, time) - повертає строкове значення тимчасової мітки Time відповідно до формату Format sub (s, t, u) - замінює в рядку u (в разі відсутності цього аргументу, застосовується до поточної записи) перше входження регулярного виразу t на рядок s system (s) - рядок s інтерпретується, як команда операційної системи і виконується командним інтерпретатором systime () - повертає число секунд, що минули з часу деякого знаменної події, з точки зору OS tolower () - переклад в нижній регістр toupper () - переклад в верх ий регістр substr (s, m, n) - Повертає підрядок рядка s, починаючи з позиції m, всього n символів. У AWK програміст може визначити свої власні функції, використовуючи синтаксис:
Fuction NameOfFunction (a, b, ..., z)
{Тіло функції}
Імена функцій не повинні збігатися з вбудованими функціями і зарезервованими словами, тобто повинні підкорятися угодою про допустимі ідентифікатори в AWK.
Тіло функції являє собою набір AWK-команда. Функція може бути рекурсивної. Кількість аргументів за регламентованих в заголовку функції може не збігатися з кількістю аргументів при її виклику, пропущені аргументи отримують значення "" (пусто).
Зовнішні змінні змінюються в тілі функції не змінюють їх значень поза функцією. Хоча, якщо аргументом функції є масив, значення його елементів можуть зміняться всередині тіла функції.
Умовне пропозицію:if (& lt умова & gt) & lt пропозицію & gt
[else & lt пропозицію & gt]
Пропозиції циклу:
while (& lt умова & gt) & lt пропозицію & gt
for (& lt вираз & gt; & lt умова & gt; & lt вираз & gt)
& lt пропозицію & gt
наприклад:
for (i = 1; i & lt = NF; i ++) - Аналогічно циклу for у мові '' С ''
for (i in array) - Цикл за елементами масиву. Але, елементи масиву доступні в цьому випадку у випадковому порядку.
break - Негайний вихід з циклу.
continue - Перехід до виконання наступного речення.
next - Негайний перехід до аналізу наступного рядка.
exit - Вихід з програми (на кінець input).
# - Коментар
1. Порахувати кількість рядків (input)
{PRINT NR}
2. Надрукувати всі рядки, що містять "olga" / olga /
3. Надрукувати всі рядки, що містять "olga", "mike" або "mal"
/ olga / || / mike / || / mal /
4. Надрукувати третє поле кожного рядка
{PRINT $ 3}
5. Надрукувати спочатку третє, а потім друге поля кожного рядка
{PRINT $ 3 $ 2}
6. Додати рядки, що містять "olga", "mike" або "mal" відповідно до файлів: folga, fmike, fmal
/ olga / {print & gt \ "folga \"} / mike / {print & gt \ "fmike \"} / mal / {print & gt \ "fmal \"}
В даному випадку знак "\" поставлений перед лапками для випадку виконанню програми безпосередньо з командного рядка. Якщо ж ваша програма буде зберігатися в окремому файлі, то того зворотного слеша перед лапками не потрібно.
Last updated: Monday, 26-Apl-1999 13:43:11 NS
& Copy 1998-99, MIMuromsky