Практическая работа с awk. Синтаксис, примеры, паттерны, обработка текстов
awk — один из самых мощных и при этом недооценённых инструментов в Linux. Его основная задача — обработка текстовых данных построчно, с возможностью фильтрации, агрегации и форматирования прямо в командной строке. Если ты работаешь с логами, CSV, выводом команд или конфигами — без awk далеко не уедешь.
В этой статье разберём awk практически: синтаксис, паттерны, переменные, условия и реальные примеры использования.
Что такое awk и где он используется
awk — это язык обработки текста, который:
- читает входные данные построчно;
- разбивает строки на поля;
- применяет правила вида pattern → action.
Типичные сценарии:
- анализ логов (
nginx,access.log, journalctl; - работа с CSV и TSV;
- агрегация данных (суммы, счётчики, средние значения);
- фильтрация вывода команд (
ps,df,netstat,ss).
Базовый синтаксис awk
Общий вид команды:
awk 'pattern { action }' fileИли с вводом из пайпа:
command | awk 'pattern { action }'Простейший пример — вывести весь файл:
awk '{ print }' file.txtprint по умолчанию печатает текущую строку.
Поля и разделители
По умолчанию awk использует пробел или таб как разделитель полей.
$0— вся строка$1— первое поле$2— второе поле$NF— последнее полеNF— количество полейNR— номер строки
Пример:
awk '{ print $1, $3 }' file.txtУказание разделителя полей
Через флаг -F:
awk -F ':' '{ print $1, $7 }' /etc/passwdЧерез переменную FS:
awk 'BEGIN { FS=":" } { print $1 }' /etc/passwdПаттерны (условия)
Паттерн определяет, когда выполнять действие.
Фильтрация по условию
awk '$3 > 1000 { print $1, $3 }' data.txtСравнение строк
awk '$2 == "ERROR" { print }' log.txtРегулярные выражения
awk '/404/ { print }' access.logawk '$1 ~ /^192\.168\./ { print }' access.logBEGIN и END блоки
BEGIN— выполняется до чтения файлаEND— выполняется после обработки всех строк
awk 'BEGIN { print "Start" } { print $1 } END { print "End" }' file.txtАрифметика и счётчики
awk отлично подходит для агрегации данных.
Подсчёт строк:
awk 'END { print NR }' file.txtСумма значений:
awk '{ sum += $3 } END { print sum }' data.txtСреднее значение:
awk '{ sum += $3 } END { print sum / NR }' data.txtУсловия if / else
awk '{
if ($3 > 100)
print $1, "big"
else
print $1, "small"
}' data.txtФорматированный вывод
Используется printf (как в C):
awk '{ printf "%-10s %6.2f\n", $1, $3 }' data.txtПолезно для отчётов и таблиц.
Работа с логами: практические примеры
Топ IP по количеству запросов
awk '{ count[$1]++ } END {
for (ip in count)
print ip, count[ip]
}' access.logПодсчёт HTTP-кодов
awk '{ codes[$9]++ } END {
for (code in codes)
print code, codes[code]
}' access.logОбработка CSV
awk -F ',' '{ print $1, $2 }' file.csvФильтрация:
awk -F ',' '$4 > 1000 { print $1, $4 }' sales.csvПеременные из командной строки
awk -v limit=100 '$3 > limit { print }' data.txtПолезно для скриптов и автоматизации.
awk в bash-скриптах
Пример обработки лога:
#!/bin/bash
awk '$9 >= 500 { print $1, $9 }' access.log > errors.txtКогда awk — лучший инструмент
Используй awk, если:
- данные структурированы по строкам;
- нужно быстро что-то посчитать или отфильтровать;
- не хочется писать Python-скрипт ради одной команды.
Если логика сложная и много состояний — тогда уже Python или Go.
Краткий итог
awk — это:
- язык и инструмент одновременно;
- идеален для логов и текстовых данных;
- незаменим в администрировании и DevOps.
Освоив базовые паттерны и приёмы, ты начнёшь решать 80% задач обработки текста одной строкой в терминале.
Настроить мониторинг за 30 секунд
Надежные оповещения о даунтаймах. Без ложных срабатываний