awk
Table of Contents
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
- Обработка файлов с пустыми строками как разделителями