Практическая работа с awk. Синтаксис, примеры, паттерны, обработка текстов

8 минут чтения
Средний рейтинг статьи — 4.7

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.txt

print по умолчанию печатает текущую строку.

Поля и разделители

По умолчанию 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.log
awk '$1 ~ /^192\.168\./ { print }' access.log

BEGIN и 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% задач обработки текста одной строкой в терминале.

8 минут чтения
Средний рейтинг статьи — 4.7

Настроить мониторинг за 30 секунд

Надежные оповещения о даунтаймах. Без ложных срабатываний