awk — один из самых мощных инструментов Linux для обработки текста, логов, CSV и табличных данных.
Это уже тяжёлая артиллерия: можно фильтровать, группировать, суммировать, форматировать и даже писать мини-скрипты прямо в командной строке.

Топ-20 самых полезных флагов awk#

Флаг Назначение
-F Установить разделитель полей
-v var=value Передать переменную в awk
-f script.awk Выполнить скрипт из файла
-W interactive Лайв-вывод при потоковой обработке
-b Чтение бинарных файлов (GNU Awk)
--posix Включить POSIX-режим
-e 'program' Передать несколько программ awk
--re-interval Поддержка регулярных выражений с повторениями
-F"\t" Установить разделитель = табуляция
-F"," Установить разделитель = запятая
`-F" “`
-F":" Установить разделитель = двоеточие
-F" " Установить разделитель = пробел
-F"[ ]+" Разделитель = любое количество пробелов
-F"[,:;]" Несколько разделителей
--lint Проверка скрипта на ошибки
-W compat Совместимость с POSIX Awk
-W version Версия awk
-W dump-variables Отладка переменных
-W source Передача встроенного awk-кода

Уровень 1 — Базовые команды (разогрев)#

awk '{print $1}' file.txt

  • Печатает первое поле из каждой строки

awk '{print $1, $3}' file.txt

  • Печатает первое и третье поле

awk '{print $0}' file.txt

  • Печатает всю строку

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

  • Выводит номер строки + содержимое

awk '{print NF}' file.txt

  • Печатает количество полей в строке

awk '{print $NF}' file.txt

  • Печатает последнее поле

awk 'NR==5' file.txt

  • Печатает только пятую строку

Уровень 2 — Фильтрация данных#

awk '/error/' file.txt

  • Печатает строки, содержащие error

awk '!/error/' file.txt

  • Печатает строки, не содержащие error

awk '$3 > 100' file.txt

  • Печатает строки, где 3-е поле > 100

awk '$2 == "active"' file.txt

  • Фильтрует строки, где 2-е поле равно “active”

awk 'NR >= 10 && NR <= 20' file.txt

  • Выводит строки с 10-й по 20-ю

awk '$2 ~ /^http/' file.txt

  • Печатает строки, где 2-е поле начинается на http

awk '$2 !~ /jpg|png/' file.txt

  • Печатает строки, где 2-е поле не содержит jpg/png

🟠 Уровень 3 — Форматированный вывод#

awk '{printf "%s\n", $1}' file.txt

  • Форматированный вывод без лишних пробелов

awk '{printf "%-10s %-5s\n", $1, $2}' file.txt

  • Выравнивание колонок

awk '{print NR, $1, $3}' file.txt

  • Печать номера строки + данных

awk 'BEGIN {print "Имя\tВозраст"} {print $1, $2}' file.txt

  • Печатает заголовок перед обработкой

awk 'END {print "Готово!"}' file.txt

  • Выводит сообщение после завершения

🔵 Уровень 4 — Вычисления и агрегация#

awk '{sum += $3} END {print sum}' file.txt

  • Сумма 3-го столбца

awk '{count++} END {print count}' file.txt

  • Подсчёт количества строк

awk '{sum += $3} END {print sum/NR}' file.txt

  • Среднее значение 3-го поля

awk '$3 > max {max=$3} END {print max}' file.txt

  • Максимум из 3-го поля

awk '$3 < min || min=="" {min=$3} END {print min}' file.txt

  • Минимум из 3-го поля

awk '{a[$2]++} END {for(i in a) print i, a[i]}' file.txt

  • Подсчёт количества уникальных значений второго столбца

🟣 Уровень 5 — Работа с разделителями#

awk -F":" '{print $1}' /etc/passwd

  • Установить : как разделитель

awk -F"," '{print $2}' data.csv

  • Разделитель — запятая

awk -F"\t" '{print $3}' data.tsv

  • Разделитель — табуляция

awk 'BEGIN {FS=":"} {print $1}' /etc/passwd

  • Установить разделитель внутри скрипта

awk 'BEGIN {OFS=";"} {print $1,$2}' file.txt

  • Установить разделитель для вывода

🔴 Уровень 6 — Мощные комбинации#

grep "ERROR" app.log | awk '{print $2}' | sort | uniq -c | sort -nr

  • Подсчёт количества ошибок по полям

find . -type f -name "*.log" | xargs awk '/ERROR/'

  • Найти все ошибки во всех логах

df -h | awk 'NR>1 {print $5, $6}'

  • Показать загрузку всех дисков

ps aux | awk '$3>10 {print $2, $3, $11}'

  • Найти процессы с нагрузкой >10% CPU

netstat -an | awk '$6=="ESTABLISHED" {print $5}'

  • Показать активные подключения

cat access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head

  • Топ-10 IP-адресов из логов

🟤 Уровень 7 — Гуру-режим#

awk 'NR==FNR{a[$1]=$2;next} {print $1,a[$1]}' file1 file2

  • Объединение двух файлов по первому полю

awk '{if($3>100) print $1, "HIGH"; else print $1, "LOW"}' file.txt

  • Условные выражения внутри awk

awk '{gsub(/foo/, "bar"); print}' file.txt

  • Заменить все foo на bar

awk 'BEGIN {IGNORECASE=1} /error/' file.txt

  • Поиск без учёта регистра

awk '{count[$2]++} END {for (x in count) printf "%s\t%d\n", x, count[x]}' file.txt

  • Подсчёт уникальных значений + форматированный вывод

awk '{split($3, arr, ":"); print arr[1]}' file.txt

  • Разделение поля по : и вывод первой части

awk 'BEGIN{RS=""; FS="\n"} {print $1, $2}' file.txt

  • Обработка файлов с пустыми строками как разделителями