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 , що містить інформацію про користувача, ідентифікатор процесу та ім'я команди: