AWK Приклади програм - IT Notes

Утиліта awk є прикладом класичної програми Linux для обробки тексту. Вона дуже універсальна і ефективна, хоч і не надає повноцінну мову програмування. Однак будьте впевнені, що її можливостей цілком вистачить для вирішення багатьох завдань автоматизованого оброблення тексту (особливо при комбінуванні з іншими консольними утилітами).

Способи запуску awk-програм

Якщо awk -програма досить проста і коротка, її код можна набрати прямо в консолі:

Як вхідні дані для awk можна використовувати не тільки текстові файли, але й виведення в стандартний потік інших програм:

У випадку, коли код awk -програми досить об'ємний або має бути збережений для повторного використання, його можна викликати з файлу з ключем -f :

Для проведення експериментів використовуємо файл test.cpp, на якому перевірятимемо результати роботи awk - програм:

Фільтрування рядків за допомогою awk

В першу чергу awk дозволяє відбирати рядки з тексту на основі регулярних виразів та деяких числових умов.

Відбір рядків, що відповідають регулярному виразу

Наприклад, щоб отримати всі рядки файлу test.cpp, що містять директиву препроцесора #include, скористаємося наступною командою:

Регулярний вираз записується між двома символами / . В результаті отримаємо:

Відбір рядків, що не відповідають регулярному виразу

Ось що залишилося:

Відбір рядків із заданого діапазону

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

Комбінування умов фільтрації

Для перевіркирядків відразу за кількома умовами використовуйте оператори && (І) та (АБО) .

Раніше ми шукали діапазон рядків за двома регулярними виразами, але якщо номери рядків, які потрібно вивести, відомі заздалегідь, все спрощується:

NR - змінна awk, яка визначає номер рядка. Таким чином, представлений код виводить 5-й і 6-й рядки:

Відбір рядків за умовами щодо окремих слів

Awk може фільтрувати текст не лише за рядками, а й за окремими словами. На i-е слово у рядку можна послатися за допомогою $i. Нумерація починається з одиниці, а $0 визначає вміст всього рядка. Кількість слів у рядку визначається за допомогою змінної NF, тому $NF вказує на останнє слово. Наприклад, знайдемо рядки, першим словом яких є int або void :

Відповідний висновок на консоль:

Однак простіше використовувати перевірку щодо регулярного виразу для слова. Для цього в awk передбачений спеціальний оператор

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

Відбір рядків на основі числових характеристик

В awk доступні арифметичні оператори мови C, що відкриває свободу дій. Приклад нижче виводить усі парні рядки (NR – номер рядка):

Наступна awk -програма виводить усі рядки, у яких довжина 1-го слова дорівнює трьом:

В результаті отримуємо:

Далі наводиться код для виведення рядків, що складаються з двох слів (NF - кількість слів у рядку):

І відповідний висновок:

Робота з рядками в awk

Як ви могли переконатися, awk має непоганий набір функцій для фільтрації рядків тексту. Однак для цих рядків ще можна виконувати різніперетворення. Команди для роботи з рядками повинні бути загорнуті у фігурні дужки < . >. Код у дужках послідовно викликається для кожного рядка тексту, що обробляється.

Форматований висновок

Awk є прямий аналог функції printf() мови C . Як приклад виведемо на початку кожного рядка її номер:

Ось що отримали:

Функції перетворення

Крім printf() є в awk та інші функції. Наприклад, print() і toupper() :

Умовні конструкції

В awk-програмах доступні оператори if-else. Наприклад, наступний код виводить без зміни рядка, у яких на 1-ій позиції стоїть int, а на останній - < , інакше на консоль вирушає --- :

Виконання коду призводить до висновку наступного:

Змінні

Доступні в awk-програмах і змінні, які не потрібно попередньо оголошувати. Наступний код для підрахунку кількості рядків та слів у тексті помістимо у файл stat.awk :

Тоді його виклик здійснюється так:

Фільтр END вказує, що код у дужках після нього має виконуватися лише після проходу всіх рядків. Доступний в awk і фільтр BEGIN, тому в більш загальному випадку програма набуває вигляду:

Зверніть увагу, що порахувати рядки та слова в тексті набагато простіше за допомогою wc :

В awk-програмах вам також доступні цикли for і while у стилі C. Для прикладу виведемо всі рядки у зворотному порядку. Створимо файл reverse.awk наступного вмісту:

Викличемо програму наступним чином:

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

Нестандартний роздільник слів

За умовчанням awk як роздільник слів використовує пробілові символи, проте таку поведінку можна змінити. Для цьогоскористайтеся ключем -F , після якого вкажіть рядок, що визначає роздільник. Наприклад, наступна програма виводить назву групи та її користувачів (якщо в групі є користувачі) з файлу /etc/group , застосовуючи як роздільник символ двокрапки:

Комбінування фільтрів та команд друку

Усі розглянуті раніше фільтри можна використовувати разом із командами обробки рядків. Достатньо записати обмеження перед фігурними дужками. Нижче наведено приклад для виведення перших 9 рядків виведення команди ps , що містить інформацію про користувача, ідентифікатор процесу та ім'я команди: