Полное практическое руководство по команде awk в Linux

Введение

awk — это один из самых мощных инструментов в среде Linux для эффективной обработки и фильтрации больших текстовых файлов и данных журналов (логов). В этой статье мы рассмотрим базовый синтаксис и практические примеры использования, которые позволяют извлекать определенные столбцы, выполнять фильтрацию по условиям и подсчитывать итоговые суммы с помощью всего одной строки команды без необходимости писать сложные скрипты.

1. Базовый принцип работы awk и извлечение определенных колонок (столбцов)

Для практики работы с командой awk создадим тестовый текстовый файл, содержащий имя пользователя, ID и должность, разделенные пробелами.

cat « ‘EOF’ > sample_users.txt
user1 1001 Developer
user2 1002 Designer
user3 1003 Manager
EOF

С помощью команды awk извлечем и выведем из каждой строки файла первое поле ($1, имя пользователя) и третье поле ($3, должность), используя пробел в качестве разделителя.
Если разделитель не указан явно, awk по умолчанию разделяет поля по последовательностям пробелов или символов табуляции.
⚙️ [Основные параметры]

-F fs : Задает разделитель входных полей (Field Separator).
-v var=val : Присваивает переменную и начальное значение для использования внутри скрипта awk перед выполнением.
-f progfile : Указывает путь к файлу, содержащему код скрипта awk для выполнения.

awk ‘{print $1, $3}’ sample_users.txt

В файле /etc/passwd, где поля разделены двоеточием (:), укажем разделитель с помощью параметра -F: и извлечем только первое поле ($1, имя учетной записи) и шестое поле ($6, путь к домашнему каталогу), просмотрев первые 5 строк.

awk -F: ‘{print $1, $6}’ /etc/passwd | head -n 5

2. Пользовательская фильтрация данных с использованием условий и операторов

Создадим практический файл server_resources.txt, содержащий данные об использовании CPU и оперативной памяти по серверам.

cat « ‘EOF’ > server_resources.txt
web-server 85 92
db-server 45 60
cache-server 92 40
backup-server 20 15
EOF

Используя условное выражение, отфильтруем серверы, у которых второе поле ($2, загрузка CPU) составляет 80% или выше, и выведем имя соответствующего сервера с предупреждающим сообщением.
Это удобно использовать для выявления системных ресурсов, превысивших пороговые значения.

awk ‘$2 >= 80 {print $1 " CPU 경고: " $2 “%”}’ server_resources.txt

С помощью логического оператора И (&&) отберем и выведем критические серверы, у которых загрузка как CPU ($2), так и памяти ($3) составляет 80% или более.
Применение составных условий позволяет изолировать только те объекты, у которых сразу несколько ресурсов превысили пороговые значения.

awk ‘$2 >= 80 && $3 >= 80 {print “위험 서버: " $1}’ server_resources.txt

3. Статистика и суммирование с использованием встроенных переменных и блоков BEGIN/END

Чтобы попрактиковаться в агрегации данных и расчете статистики с помощью awk, создадим тестовый файл sales_data.txt, содержащий наименования товаров и суммы продаж.

cat « ‘EOF’ > sales_data.txt
Apple 5000
Banana 3000
Orange 4500
Grape 8000
EOF

Блок BEGIN выводит вступительное сообщение до начала обработки основного текста, а значение второго поля ($2) каждой строки накапливается в переменной sum.
В блоке END, который выполняется после обработки всех строк файла, рассчитываются и выводятся общая сумма продаж и среднее значение продаж с использованием встроенной переменной NR (общее количество записей).

awk ‘BEGIN {print “— 매출 집계 시작 —”} {sum += $2; print $1 “: " $2} END {print “——————-”; print “총 매출: " sum “원”; print “평균 매출: " sum/NR “원”}’ sales_data.txt

4. Практический анализ логов веб-сервера и фильтрация аномального трафика

Для отработки анализа логов веб-сервера и отслеживания ошибок создадим пример файла логов access.log в стандартном формате Nginx и Apache.

cat « ‘EOF’ > access.log
192.168.1.10 - - [10/Oct/2026:10:00:01] “GET /index.html” 200 4502
192.168.1.11 - - [10/Oct/2026:10:00:02] “POST /login” 401 1024
192.168.1.12 - - [10/Oct/2026:10:00:03] “GET /api/data” 500 2048
192.168.1.10 - - [10/Oct/2026:10:00:04] “GET /dashboard” 200 8920
192.168.1.13 - - [10/Oct/2026:10:00:05] “POST /login” 401 1024
EOF

С помощью оператора сопоставления с регулярными выражениями (~) отфильтруем строки с ошибками клиентов 4xx и ошибками сервера 5xx, где девятое поле ($9, HTTP-код состояния) начинается с 4 или 5.
Извлечение только IP-адреса подключения ($1), запрашиваемого URI ($7) и кода состояния ($9) из подходящих под условие записей позволяет быстро оценить сбои и аномальные всплески трафика.

awk ‘$9 ~ /^[45]/ {print $1, $7, $9}’ access.log

Используя ассоциативные массивы awk (ip[$1]++), подсчитаем количество запросов для каждого подключающегося IP-адреса, затем выведем общее накопленное количество с помощью цикла в блоке END и отсортируем по убыванию частоты запросов через конвейер sort -rn.
Это практический метод анализа для выявления чрезмерного трафика или аномальных попыток доступа с конкретных IP-адресов.

awk ‘{ip[$1]++} END {for (i in ip) print ip[i], i}’ access.log | sort -rn

Мы рассмотрели базовый синтаксис и ключевые практические примеры использования команды awk, которая существенно упрощает обработку текста и анализ больших объемов логов в среде Linux.
Попробуйте применить рассмотренные опции и шаблоны в своей повседневной работе, чтобы сделать рутинные задачи по извлечению и обработке данных еще более эффективными и автоматизированными.