Статьи

TEXTS

  1. 1.2.1 Стандартні змінні
  2. 1.2.2 Значення змінних
  3. 1.2.3 Змінні поля
  4. 1.2.4 Масиви
  5. 1. Порахувати кількість рядків (input)
  6. 3. Надрукувати всі рядки, що містять "olga", "mike" або "mal"
  7. 4. Надрукувати третє поле кожного рядка
  8. 5. Надрукувати спочатку третє, а потім друге поля кожного рядка
  9. 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) -Fc - встановлює роздільник полів в с (Див

1. Мова програмування AWK допускає використання:

  • полів;
  • Змінних (Стандартних, Масивів);
  • Арифметичних виразів.

2. Зразок:

  • Регулярний вираз;
  • Вираз відносини;
  • Комбінація зразків;
  • BEGIN і END.

3. Дія:

  • Послідовність пропозицій, розділених ''; '' Або '' \ n '' (новий рядок)

Речення:

  1. Висновок (Друк);
  2. Присвоєння;
  3. Вбудована функція;
  4. Керуюча структура.

Кожна сканована рядок input розглядається як що складається з полів, розділених розділовими символами (за замовчуванням - пробіл).

На поля можна посилатися з AWK програми наступним чином:

  1. $ 1 - Перше поле;
  2. $ 2 - Друге поле;
  3. ... і так далі...
  4. $ 0 - Посилається на весь рядок цілком.

Рядок може містити максимально до 100 полів. Рядок може містити максимально до 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 - символ-роздільник для індексів масивів - адресує всю запис цілком $ 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. Взагалі AWK в стані при перетворенні рядка в число розпізнати такі рядки: 100, 1n00, 100fg як число 100

1.2.3 Змінні поля

Посилання на поля $ 1, $ 2, ... можуть інтерпретуватися як змінних, наприклад:

$ 1 = "3" + $ 2 - перше поле приймає значення другого поля, збільшеного на 3.

$ (i + 1) - інтерпретується як поле, номер якого залежить від значення змінної i. $ (i + 1) - інтерпретується як поле, номер якого залежить від значення змінної i

1.2.4 Масиви

Допускається використання масивів. Масиви не з'являються, а приймають значення з контексту, наприклад:

x [NR] = $ 0 - елементу масиву x, індексувати NR , Присвоюється обробляється рядок.

x [ "apple"] - елементи масиву можуть індексуватися НЕ числовим значенням, тобто рядком. 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, укладених в / /. /\/

Вираз ставлення може бути двох типів:

Логічні операції

- логічне або - логічне і "||" "&&" "- менше, менше або дорівнює"> =,> "- більше або дорівнює, більше" == "- чисельне рівність або збіг рядків"! "- заперечення" ~ "- перевірка на вміст

наприклад:

$ 1 ~ / [Oo] lga / - Вказує на рядки, перше поле яких містить Olga або olga.

$ 1 & gt = "s" - Вказує на рядки, що починаються з символу s або наступних за ним по порядку: t, u, v ... $ 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, тобто кількість оброблених вхідних рядків. 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 в мові '' С ''. Формат може містити:

Оператор присвоювання має вигляд:

& lt змінна & gt = & lt вираз & gt

Початкове значення змінної 0 або "" (пробіл). Допускаються інші типи привласнення, відповідно до мови '' С '': "+ =", "- =", "* =", "/ =", "% =".

& lt змінна & gt ++, ++ & lt змінна & gt - збільшення значення змінної на 1.

& 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 символів. - арктангенс cos () - косинус exp (), log (), sqrt () - Математичні функції експонента, логарифм і квадратний корінь У 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

Новости