Команда awk — это Мощная утилита для обработки текста в Unix/Linux, которая построчно сканирует текст, разбивает его на поля и выполняет правила обработки шаблонов для фильтрации, преобразования и обобщения данных.
Он отлично подходит для быстрого анализа логов, CSV-файлов и системных выходных данных, что делает его незаменимым для DevOps, SRE и работы с данными в командной строке. Если вы работаете с серверами Linux или manage При развертывании кода изучение команды awk — один из наиболее полезных навыков, которые вы можете приобрести.
В этом простом руководстве для начинающих пошагово объясняется работа с awk на практических примерах, от простой печати до анализа логов в реальных условиях. Вы также узнаете советы, которые профессионалы ежедневно используют в хостинговых и облачных средах.
Что такое команда awk?
awk — это алгоритм, основанный на шаблонах. Язык обработки данных, доступный в большинстве Unix-подобных систем (Linux, macOS, BSD).

Названная в честь своих создателей (Ахо, Вайнбергер, Керниган), эта программа считывает входные данные построчно (записи), разбивает каждую на поля и выполняет действия при совпадении шаблонов. Она идеально подходит для извлечения столбцов, фильтрации строк, вычисления агрегатных функций и быстрого создания отчетов.
В отличие от sed или grep, awk изначально понимает «столбцы» и поддерживает переменные, массивы, условные операторы и функции, что позволяет заменить небольшие скрипты, оставаясь при этом легковесным и быстрым.
Синтаксис и основы awk
Структура действий по шаблону
По своей сути, программы awk — это Список правил шаблона { действие }. awk выполняет действие только для строк, в которых шаблон совпадает. Без шаблона действие выполняется для всех строк. Без действия по умолчанию выполняется вывод найденных строк.
awk 'pattern { action }' file
awk '{ print $0 }' file # print every line (default action shown explicitly)
awk '/error/' file # print lines matching regex "error"
Поля, записи и разделители
awk разделяет каждую строку (запись). Разделитель полей используется для обозначения разделителей. По умолчанию разделителем полей (FS) является любой пробел. Доступ к полям осуществляется как $1, $2, …, а вся строка — как $0. Изменить разделитель полей можно с помощью параметра -F или внутри блока BEGIN.
# space-separated
awk '{ print $1, $3 }' data.txt
# comma-separated (CSV-like)
awk -F, '{ print $1, $3 }' data.csv
# set output field separator for pretty printing
awk -F, 'BEGIN{ OFS="\t" } { print $1, $3 }' data.csv
Полезные встроенные переменные
Наиболее часто используемые встроенные функции:
- NR: текущий номер записи (строки)
- ФНР: текущий номер записи в текущем файле
- НФ: количество полей в текущей строке
- FS/OFS: разделитель полей ввода/вывода
- RS/OR: разделитель записей ввода/вывода
- $ 0: вся строка; $1..$NF: поля
# print line number and first field
awk '{ print NR, $1 }' file
# print last field of each line
awk '{ print $NF }' file
Начало работы: основные примеры использования awk
Печать столбцов и изменение их порядка
# Reorder fields 3 and 1; add a dash between
awk '{ print $3 "-" $1 }' access.log
# Print specific columns from top output (skip header)
top -b -n1 | awk 'NR>7 { print $1, $9, $12 }'
Фильтрация строк по значению или регулярному выражению
# Lines where 3rd field equals "FAILED"
awk '$3=="FAILED"' audit.log
# Requests returning 500 status code in Nginx access log (status is $9 or $8 depending on format)
awk '$9==500' /var/log/nginx/access.log
# Regex match: case-insensitive search for "timeout"
awk 'tolower($0) ~ /timeout/' app.log
Вычислите суммы, средние значения и минимальные/максимальные значения.
# Sum the 2nd column
awk '{ sum += $2 } END { print sum }' metrics.txt
# Average of column 4 (skip lines starting with #)
awk '$0 !~ /^#/ { n++; total += $4 } END { if (n>0) print total/n }' data.txt
# Track min and max
awk 'NR==1{min=max=$2} { if($2<min)min=$2; if($2>max)max=$2 } END{ print "min",min,"max",max }' stats.txt
Подсчет уникальных значений и частоты
Ассоциативные массивы значительно упрощают группировку.
# Count requests per IP (IP assumed to be $1)
awk '{ hits[$1]++ } END { for (ip in hits) print hits[ip], ip }' access.log | sort -nr | head
Работа с CSV-файлами и пользовательскими разделителями.
Для простых CSV-файлов (без кавычек)-F работает. Для более сложных CSV-файлов функция FPAT в gawk может помочь сопоставлять поля как токены, а не разделять их по запятым.
# Basic CSV, print columns 1 and 3
awk -F, 'BEGIN{OFS=","} {print $1, $3}' users.csv
# gawk: handle commas inside quotes (basic FPAT pattern)
gawk 'BEGIN{ FPAT = "([^,]*)|(\"[^\"]+\")"; OFS="," } { print $1, $3 }' users.csv
Используйте блоки BEGIN и END.
Функция BEGIN выполняется до чтения входных данных; Команда END запускается после обработки всех строк, что удобно для заголовков, сводок и однократной установки FS/OFS.
awk 'BEGIN{ print "User,Count" } { c[$1]++ } END{ for (u in c) print u, c[u] }' log.txt
Практические примеры использования в реальном мире
Анализ журналов веб-сервера (Apache/Nginx)
Операционные группы регулярно используют awk для Устранение неполадок, связанных с трафиком, производительностью и безопасностью. Примеры предполагают использование распространенного объединенного формата журналов; скорректируйте номера полей в соответствии с вашим фактическим форматом.
# Top 10 IPs by request volume
awk '{ ip=$1; hits[ip]++ } END{ for(ip in hits) print hits[ip], ip }' access.log | sort -nr | head -10
# Top 10 requested URLs (path often $7)
awk '{ path=$7; c[path]++ } END{ for(p in c) print c[p], p }' access.log | sort -nr | head -10
# Status code distribution (status often $9)
awk '{ sc=$9; c[sc]++ } END{ for(s in c) print s, c[s] }' access.log | sort -k1,1
# Total bytes sent (bytes often $10)
awk '$10 ~ /^[0-9]+$/ { bytes += $10 } END { print "Total bytes:", bytes }' access.log
Перенаправить вывод awk в функцию сортировки. Используйте uniq или head для быстрых отчетов. В сочетании с grep можно предварительно отфильтровать даты или виртуальные хосты.
Мониторинг системных и прикладных метрик
# CPU usage from mpstat: average user+system
mpstat 1 5 | awk '/Average/ { print "CPU %usr+%sys:", $3 + $5 }'
# Memory usage from /proc/meminfo
awk '/MemTotal/ {t=$2} /MemAvailable/ {a=$2} END{ printf "Mem Used: %.2f%%\n", (t-a)/t*100 }' /proc/meminfo
# Slow queries over 2s in application log (assuming duration is field 6 in seconds)
awk '$6+0 > 2 { print }' app.log
Очистить и преобразовать данные
# Normalize case and trim extra spaces
awk '{ gsub(/^ +| +$/,""); $0=tolower($0); print }' raw.txt
# Replace delimiter: tabs to commas
awk 'BEGIN{ OFS=","; FS="\t" } { print $1,$2,$3 }' input.tsv > output.csv
Совместная работа awk с другими инструментами командной строки
Awk отлично подходит для работы с конвейерами обработки данных. Он дополняет grep (предварительная фильтрация), sort (упорядочивание), uniq (дедупликация) и sed (замена текста). Используйте каждый инструмент по назначению, чтобы команды оставались короткими и читаемыми.
Продвинутые методы Awk
Группировка и агрегирование по ключам
# Revenue per customer (customer_id in $1, amount in $3)
awk -F, '{ rev[$1] += $3 } END { for (id in rev) printf "%s,%0.2f\n", id, rev[id] }' sales.csv | sort -t, -k2,2nr | head
Шаблоны диапазонов и обработка нескольких файлов
Соответствие шаблонов диапазона из Одно условие переходит в другое; FNR сбрасывается для каждого файла отдельно, NR является глобальным для всех файлов.
# Print lines between markers
awk '/BEGIN_REPORT/,/END_REPORT/' app.log
# Compare corresponding lines across files
awk 'FNR==NR { a[$1]=$2; next } { print $0, a[$1] }' left.txt right.txt
Функции, условные операторы и массивы
# Derive buckets with if/else and functions
awk '{
score=$2
if (score>=90) grade="A"
else if (score>=80) grade="B"
else grade="C"
print toupper($1), grade, length($1)
}' grades.txt
Советы по производительности и портативности
- Предпочитаю простые узоры. и минимальное количество вызовов gsub для больших файлов.
- Используйте числовые сравнения (например, $3+0 >= 100), чтобы избежать строковой семантики.
- Установить FS/OFS Начните с первого раза для достижения стабильности.
- Для очень больших объемов данных, передача потока на внешнюю сортировку для упорядочивания больших объемов данных.
- Придерживайтесь POSIX awk Для обеспечения портативности используйте функции gawk (FPAT, asort) при необходимости.
Распространенные ошибки и лучшие практики
- Цитата: Заключайте программы awk в одинарные кавычки, чтобы предотвратить раскрытие символов оболочкой. Экранируйте одинарные кавычки с осторожностью.
- Номера полей: Форматы журналов различаются; проверьте, в каком столбце в вашей среде хранятся данные о состоянии, пути или байтах.
- Сложность CSV-файлов: В реальных CSV-файлах присутствуют кавычки и переносы строк; для более надежной обработки CSV-файлов можно использовать gawk с FPAT или специализированные инструменты, такие как Miller.
- Местное время: Сортировка и преобразование регистра могут различаться в зависимости от локали. Установите LC_ALL=C для предсказуемого поведения.
- Тестирование: Начните с небольшой выборки (головы) и постепенно добавляйте условия.
awk, sed и grep: когда какой использовать
- Используйте grep для поиска линии, соответствующие шаблону (быстрая фильтрация).
- Используйте sed для замены или отредактируйте текст на месте (редактор потока).
- Используйте awk для анализа полей. вычислить значения, сгруппировать и суммировать (структурированная обработка).
С помощью Grese можно сузить область ввода.awk используется для вычислений, sed — для очистки выходных данных. Такой подход, ориентированный на конвейер, обеспечивает эффективность и удобство сопровождения командной строки.
Как awk помогает командам хостинга и DevOps
От выявления несанкционированных IP-адресов до количественной оценки пиков трафика 5xx, awk позволяет за считанные секунды преобразовывать необработанные логи в ответы без необходимости использования сложных инструментов. В средах хостинга такая скорость ускоряет реагирование на инциденты, планирование мощностей и настройку производительности, особенно при подключении по SSH к производственным серверам с ограниченными ресурсами.
At YouStable, Наши manageхостинг и VPS Клиенты часто запрашивают практическую возможность мониторинга без сложных стеков. awk, наряду со стандартными инструментами Linux, обеспечивает мгновенный анализ ситуации.
Если вам необходимы проактивный мониторинг, оптимизированные веб-стеки и практическая поддержка на вашем языке, наша команда поможет вам внедрить эти методы в масштабах предприятия.
Более практичные остроумные фразы, которые вы будете использовать снова и снова.
# Remove duplicate lines while keeping first occurrence
awk '!seen[$0]++' file.txt
# Show lines with more than N fields (e.g., malformed)
awk 'NF > 10' data.txt
# Add header to computed report
awk 'BEGIN{print "status,count"} {c[$9]++} END{for(s in c) print s "," c[s]}' access.log
# Extract date (first field) and count per day
awk '{ d=$1; gsub(/\[|\]/,"",d); day=substr(d,1,11); hits[day]++ } END{ for (k in hits) print hits[k], k }' access.log | sort -nr
Часто задаваемые вопросы (FAQ)
Для чего используется команда awk в Linux?
awk — это язык обработки текста. Используется для построчного сканирования файлов, разделения строк на поля и применения правил обработки шаблонов. Применяется для извлечения столбцов, фильтрации строк, вычисления статистики, создания отчетов и преобразования данных, особенно из журналов, CSV-файлов и результатов выполнения команд.
Как вывести на экран определенные столбцы с помощью awk?
Используйте $1, $2, … для ссылки на поля. Для CSV-файлов установите параметр -F, а при необходимости — OFS для вывода. Пример: awk -F, 'BEGIN{OFS=”,”} {print $1,$3}' file.csv выводит первый и третий столбцы через запятую.
В чём разница между NR и FNR в awk?
NR — это полная строка Счетчик по всем входным файлам постоянно увеличивается. FNR — это количество строк в текущем файле, которое сбрасывается до 1, когда awk начинает работу с новым файлом. Используйте шаблоны FNR==NR для построения карт поиска на основе первого файла, а затем обработайте второй.
Может ли awk обрабатывать сложные CSV-файлы с запятыми в кавычках?
Basic awk with -F, возникают проблемы, когда поля содержат запятые внутри кавычек. gawk решает эту проблему с помощью FPAT, определяя поля как токены. Для полностью надежного CSV (экранированные кавычки, переносы строк) рассмотрите специализированные инструменты, такие как Miller или xsv.
Что лучше: awk, sed или grep?
Они решают разные проблемы..grep выполняет поиск, sed редактирует потоки, а awk анализирует и вычисляет. Для структурированного анализа (столбцы, группировка, суммы) лучше всего подходит awk. Объедините их в конвейеры для получения наиболее эффективных и читаемых командных строк.
Освоение команды awk Это быстро окупится в любом рабочем процессе Linux, DevOps или хостинга. Держите эти примеры под рукой, адаптируйте их к форматам ваших логов, и вы за считанные секунды превратите необработанный текст в полезную информацию для принятия решений.