Як використовувати команду awk в Linux

У світі 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`, щоб отримати його значення. Крапка в кінці слова вважається частиною цього поля.