У світі Linux, `awk` — це неймовірно потужний інструмент для обробки текстових даних безпосередньо з командного рядка, а також гнучка мова програмування для створення сценаріїв. Розглянемо ближче деякі з його ключових можливостей.
Походження назви `awk`
Назва команди `awk` походить від ініціалів імен трьох розробників, що створили її оригінальну версію у 1977 році: Альфреда Ахо, Пітера Вайнбергера та Браяна Кернігана. Ці видатні інженери працювали в легендарних AT&T Bell Laboratories, що зробили значний внесок у розвиток Unix. З того часу `awk` постійно вдосконалюється завдяки внеску багатьох програмістів.
Інструмент `awk` є повноцінною мовою для створення скриптів, а також незамінним помічником у маніпулюванні текстом в командному рядку. Якщо вас зацікавила ця стаття, радимо ознайомитися з детальним описом функціоналу `awk`.
Принципи роботи: шаблони та дії
Програми `awk` складаються з правил, кожне з яких має шаблон і відповідну дію. Дія застосовується до тих рядків тексту, які відповідають заданому шаблону. Шаблони укладаються у фігурні дужки (`{}`). Разом шаблон і дія формують правило. Вся програма `awk` повинна бути в одинарних лапках (`’`).
Розглянемо найпростіший приклад програми `awk`, яка не має шаблону. Це означає, що дія буде виконуватися для кожного рядка вхідного тексту. Чудовим прикладом є використання цієї функції разом з командою `who`.
Типовий вивід команди `who` виглядає так:
who
Можливо, нам не потрібна вся ця інформація, а лише імена користувачів. Ми можемо передати вивід `who` в `awk`, і попросити його показати тільки перше поле кожного рядка.
За замовчуванням `awk` ідентифікує поле як послідовність символів, що відокремлена пробілами, початком або кінцем рядка. Поля позначаються знаком долара (`$`) та номером. Таким чином, `$1` представляє перше поле. Ми використаємо дію `print`, щоб вивести лише це перше поле.
Введіть наступну команду:
who | awk '{print $1}'
`awk` відобразить перше поле і проігнорує решту рядка.
Ми можемо вивести стільки полів, скільки потрібно. Якщо поля розділені комою, `awk` автоматично додасть пробіл між ними.
Щоб вивести також час входу користувача в систему (четверте поле), введіть:
who | awk '{print $1,$4}'
Існують спеціальні ідентифікатори для полів:
`$0`: представляє весь рядок тексту.
`$1`: представляє перше поле.
`$2`: представляє друге поле.
`$7`: представляє сьоме поле.
`$45`: представляє 45-е поле.
`$NF`: означає “кількість полів” і вказує на останнє поле.
Розглянемо приклад з текстовим файлом, що містить коротку цитату Денніса Річі:
cat dennis_ritchie.txt
Припустимо, нам потрібно вивести перше, друге і останнє поле цієї цитати. Зауважте, що, хоча цитата відображається в декількох рядках, в файлі це лише один рядок тексту.
Виконаємо наступну команду:
awk '{print $1,$2,$NF}' dennis_ritchie.txt
Слово “простота” є 18-м полем у рядку, але нам немає потреби це знати. Ми знаємо, що воно є останнім, і можемо використовувати `$NF`, щоб отримати його значення. Крапка в кінці слова вважається частиною цього поля.