Команда AWK в Unix/Linux з прикладами

Команда AWK в Unix/Linux з прикладами
Переклад 6 хв. читання
03 серпня 2023

Awk - це скриптова мова, яка використовується для маніпулювання даними та створення звітів. Командна мова програмування awk не потребує компіляції та дозволяє користувачеві використовувати змінні, числові функції, рядкові функції та логічні оператори.

Awk - це утиліта, яка дозволяє програмісту писати крихітні, але ефективні програми у вигляді операторів, що визначають текстові шаблони, які слід шукати в кожному рядку документа, і дії, які слід виконати, коли збіг знайдено в рядку. Awk здебільшого використовується для сканування та обробки шаблонів. Вона шукає в одному або декількох файлах рядки, які відповідають заданим шаблонам, а потім виконує відповідні дії.

Awk - це скорочення від імен розробників - Aho, Weinberger та Kernighan.

ЩО МИ МОЖЕМО РОБИТИ ЗА ДОПОМОГОЮ AWK?

1. Операції AWK:

  • Сканує файл рядок за рядком
  • Розбиває кожен рядок на поля
  • Порівнює вхідний рядок/поля з шаблоном
  • Виконує дії над знайденими рядками

2. Корисно для

  • Перетворення файлів даних
  • Створення форматованих звітів

3. Конструкції програмування:

  • Форматування виведених рядків
  • Арифметичні та рядкові операції
  • Умови та цикли

Синтаксис:

awk options 'selection _criteria {action }' input-file > output-file

Приклади команд

Приклад:

Розглянемо наступний текстовий файл employee.txt як вхідний файл для всіх наведених нижче прикладів:

ajay manager account 45000
sunil clerk account 25000
varun manager sales 50000
amit manager account 47000
tarun peon sales 15000
deepak clerk sales 23000
sunil peon sales 13000
satvik director purchase 80000 

1. Поведінка Awk за замовчуванням

За замовчуванням Awk друкує кожен рядок даних із вказаного файлу.

$ awk '{print}' employee.txt

Результат:

ajay manager account 45000
sunil clerk account 25000
varun manager sales 50000
amit manager account 47000
tarun peon sales 15000
deepak clerk sales 23000
sunil peon sales 13000
satvik director purchase 80000 

У наведеному вище прикладі шаблон не задано. Тому дії застосовуються до всіх рядків. Дія print без аргументів за замовчуванням друкує увесь рядок, тому вона друкує усі рядки файлу без помилок.

2. Вивести рядки, які відповідають заданому шаблону.

$ awk '/manager/ {print}' employee.txt 

Результат:

ajay manager account 45000
varun manager sales 50000
amit manager account 47000 

У наведеному вище прикладі команда awk виводить весь рядок, що містить слово "manager".

3. Розбиття рядка на поля

Для кожного запису, тобто рядка, команда awk за замовчуванням розбиває запис на поля, розділені пробілами, і зберігає їх у змінних $n. Якщо рядок складається з 4 слів, його буде збережено у змінних $1, $2, $3 і $4 відповідно. Крім того, $0 представляє весь рядок.

$ awk '{print $1,$4}' employee.txt 

Результат:

ajay 45000
sunil 25000
varun 50000
amit 47000
tarun 15000
deepak 23000
sunil 13000
satvik 80000 

У наведеному вище прикладі $1 і $4 представляють поля Name і Salary відповідно.

Вбудовані змінні в Awk

Вбудовані змінні Awk включають змінні полів - $1, $2, $3 і так далі ($0 - весь рядок), які розбивають рядок тексту на окремі слова або фрагменти, що називаються полями.

  • NR: Команда NR веде поточний підрахунок кількості вхідних записів. Пам'ятайте, що записи зазвичай є рядками. Команда Awk виконує оператори шаблону/дії один раз для кожного рядка у файлі.
  • NF: Команда NF веде підрахунок кількості полів у поточному вхідному записі.
  • FS: команда FS містить символ-розділювач полів, який використовується для розділення полів у вхідному рядку. За замовчуванням це "пробіл", тобто пробіл і символи табуляції. FS можна перепризначити на інший символ (зазвичай у команді BEGIN), щоб змінити роздільник полів.
  • RS: Команда RS зберігає поточний символ-розділювач запису. Оскільки за замовчуванням вхідним записом є рядок вводу, символом-розділювачем запису за замовчуванням є новий рядок.
  • OFS: команда OFS зберігає символ-розділювач вихідних полів, яким Awk буде розділяти поля під час їх виведення. За замовчуванням це пробіл. Якщо виводиться декілька параметрів, розділених комами, буде надруковано значення OFS між кожним параметром.
  • ORS: Команда ORS зберігає розділювач вихідних записів, за допомогою якого Awk буде розділяти рядки виводу під час їх друку. За замовчуванням це символ нового рядка. print автоматично виводить значення ORS наприкінці будь-якого рядка, який було задано для друку.

Приклади:

Використання вбудованих змінних NR (Відображення номера рядка)

$ awk '{print NR,$0}' employee.txt 

Результат:

1 ajay manager account 45000
2 sunil clerk account 25000
3 varun manager sales 50000
4 amit manager account 47000
5 tarun peon sales 15000
6 deepak clerk sales 23000
7 sunil peon sales 13000
8 satvik director purchase 80000 

У наведеному вище прикладі команда awk з NR виводить усі рядки разом з номером рядка.

Використання вбудованих змінних NF (Display Last Field)

$ awk '{print $1,$NF}' employee.txt 

Результат:

ajay 45000
sunil 25000
varun 50000
amit 47000
tarun 15000
deepak 23000
sunil 13000
satvik 80000 

У наведеному вище прикладі $1 представляє Ім'я, а $NF - Зарплату. Ми можемо отримати Зарплату за допомогою $NF, де $NF - останнє поле.

Інше використання вбудованих змінних NR (рядок відображення від 3 до 6)

$ awk 'NR==3, NR==6 {print NR,$0}' employee.txt 

Результат:

3 varun manager sales 50000
4 amit manager account 47000
5 tarun peon sales 15000
6 deepak clerk sales 23000 

Більше прикладів

Для заданого текстового файлу geeksforgeeks.txt:

A    B    C
Tarun    A12    1
Man    B6    2
Praveen    M42    3

1) Вивести перший елемент разом з номером рядка (NR), відокремленим " – " для кожного рядка у файлі geeksforgeeks.txt:

$ awk '{print NR " - " $1 }' geeksforgeeks.txt 

Результат:

1 - A
2 - Tarun
3 - Manav    
4 - Praveen

2) Повернути другий стовпець/елемент з geeksforgeeks.txt:

$ awk '{print $2}' geeksforgeeks.txt 

Результат:

B
A12
B6
M42

3) Знайти довжину найдовшого рядка у файлі:

$ awk '{ if (length($0) > max) max = length($0) } END { print max }' geeksforgeeks.txt

Результат:

13

4) Підрахувати кількість рядків у файлі:

$ awk 'END { print NR }' geeksforgeeks.txt 

Результат:

4

5) Друк рядків, довжина яких перевищує 10 символів:

$ awk 'length($0) > 10' geeksforgeeks.txt 

Результат:

Tarun    A12    1
Praveen    M42    3

6) Знайти/перевірити наявність будь-якого рядка в будь-якому конкретному стовпчику:

awk '{ if($2 == "B6") print $0;}' geeksforgeeks.txt

Результат:

Man    B6    2

7) Вивести квадрати перших чисел від 1 до n, скажімо 6:

$ awk 'BEGIN { for(i=1;i<=6;i++) print "square of", i, "is",i*i; }' 

Результат:

square of 1 is 1
square of 2 is 4
square of 3 is 9
square of 4 is 16
square of 5 is 25
square of 6 is 36
Джерело: AWK command in Unix/Linux with examples
Помітили помилку? Повідомте автору, для цього достатньо виділити текст з помилкою та натиснути Ctrl+Enter
Коментарі (0)

    Ще немає коментарів

Щоб залишити коментар необхідно авторизуватися.

Вхід / Реєстрація