- awk — это инструмент и язык сценариев, ориентированный на обработку текста построчно и по столбцам, идеально подходящий для фильтрации, преобразования и анализа результатов. команды и файлы.
- Это позволяет определять шаблоны и действия, комбинируя регулярные выражения, специальные переменные, такие как $0, $1, NF или NR, и функции, такие как length, substr или match, для создания очень точных фильтров.
- awk комфортно работает с разделителями и полями, используя FS, OFS и такие параметры, как -F, и может формат Выводит данные с помощью print и printf, выполняет математические операции и управляет переменными с помощью -v.
- Можно создавать полноценные скрипты awk, автоматизирующие сложные задачи, включая поиск и замену с помощью gsub, сложные вычисления и генерацию отчетов на основе таких команд, как ps, df или системных файлов.

Когда вы начинаете серьёзно относиться к консоли Linux Вы обнаружите, что работа с текстом — это не просто просмотр файлов. cat Вот и всё. Как только вы начнёте... бревна Для обработки огромных списков процессов, результатов выполнения команд или CSV-файлов вам потребуется гораздо более мощное средство для фильтрации, преобразования и обобщения данных, которое не позволит вам сойти с ума.
Вот тут-то и пригодится awk.: команда, которая, будучи не просто фильтром, фактически представляет собой язык programación Awk — это инструмент для обработки текста, позволяющий искать шаблоны, выбирать столбцы, выполнять вычисления, определять условия, использовать переменные, циклы, функции и даже писать целые скрипты. В этом руководстве по Awk для Linux мы шаг за шагом рассмотрим его, от основ до довольно сложных применений, включая всевозможные примеры из реальной жизни, работающие в консоли.
Что такое awk и для чего он используется в Linux?
Awk — это одновременно инструмент командной строки и язык сценариев. Этот инструмент, предназначенный для анализа текста, структурированного по строкам и полям, получил свое название от инициалов его создателей (Ахо, Вайнбергер и Керниган). Он используется с конца 70-х годов, но остается ключевым компонентом в любой среде. Юникс или GNU/Linux (например, для Запустите старые версии Unix на своем ПК.).
Философия awk очень проста.Эта команда построчно обрабатывает файл (или вывод команды), разделяет каждую строку на столбцы в соответствии с разделителем, проверяет выполнение условия и, если оно выполнено, выполняет действие. Если условие не указано, действие применяется ко всем строкам; если действие не указано, по умолчанию выполняется вывод всей строки.
С помощью этого простого механизма можно совершать поистине невероятные вещи.: от отображения только некоторых столбцов ps o df...для вычисления итоговых сумм, фильтрации по сложным шаблонам с использованием регулярных выражений, замены текста, форматирования отчетов, работы с CSV-файлами или даже написания скриптов из нескольких десятков строк.
Хотя команда awk может немного напоминать grep или sed.Его подход более структурирован: строки рассматриваются как записи, а слова (или поля) — как столбцы, с внутренними переменными и мини-языком, что делает его идеальным для быстрой обработки табличных данных.
На практике, если вы хотите начать писать полноценные скрипты командной оболочки...Знание awk, а также других утилит, практически обязательно. sed, grep, cut и компания. Они являются основными строительными блоками текстовых редакторов в Linux.
Установите и запустите awk (gawk) в вашей системе.
В большинстве современных дистрибутивов GNU/Linuxawk уже установлен по умолчанию, обычно в варианте GNU awk (gawkВы можете проверить это с помощью:
awk --version
Если по какой-то причине у вас он не установленВ Debian, Ubuntu и производных дистрибутивах можно использовать менеджер пакетов:
sudo apt update && sudo apt install gawk
Оно также доступно для macOS.Вы можете использовать системную версию или установить обновленную версию с помощью Homebrew:
brew install gawk
После установки awk всегда используется с тем же принципом.Вы передаете инструкции в одинарных кавычках и в файл (или перенаправляете вывод другой команды). Например:
awk '{print}' archivo.txt
Также можно использовать awk в качестве интерпретатора скриптов., указывающий путь к исполняемому файлу в первой строке файла:
#!/usr/bin/awk -f
а затем запустить скрипт напрямую или с awk -f script.awk.
Базовый синтаксис: шаблоны и действия

Минимальная структура awk выглядит следующим образом:
awk 'patrón { acción }' fichero
Каждая строка файла сравнивается с образцом.Если совпадение найдено, выполняется действие внутри фигурных скобок. Если шаблон опущен, действие применяется ко всем строкам. Несколько важных моментов:
Специальные переменные для ссылки на каждую строку:
$0: вся строка.$1, $2, $3, …: поля (столбцы) строки, разделенные заданным разделителем.NF: количество полей в текущей строке.NR: текущий регистрационный номер (глобальный номер строки).FNR: номер строки в текущем файле, полезно при обработке нескольких файлов.
Особые инструкции:
BEGIN { … }: блок, который выполняется до чтения какой-либо строки.END { … }: блок, который выполняется после обработки всех строк.
Наиболее распространенные команды вывода:
print: выводит аргументы, разделенные разделителем вывода (OFS(по умолчанию — пробел).printf: похожий наprintfВ языке C это позволяет выполнять детальное форматирование без добавления автоматических переносов строк.
Минимальный пример печати файла в точно таком виде, как если бы он был cat:
awk '{print}' archivo.txt
Или, если вы хотите, чтобы отображалась также длина каждой строки.:
awk '{print length, "\t", $0}' archivo.txt
Работа со столбцами и разделителями в awk
Одно из ключевых применений awk — это манипулирование столбцами. из результатов выполнения команд, например: ps, df или файлы, подобные /etc/passwdПо умолчанию awk считает пробел или табуляцию разделителем, но вы можете использовать практически любой разделитель.
Выберите определенные столбцы
Представьте себе уход ps с несколькими столбцами (PID, TTY, TIME, CMD…)Если вам нужны только PID, просто выполните следующие действия:
ps | awk '{print $1}'
Если вас интересует вторая колонка (например, для людей с нарушениями слуха),:
ps | awk '{print $2}'
А если вы хотите пропустить первую строку (заголовок)Вы можете отфильтровать результаты по регистрационному номеру:
ps | awk 'NR>1 {print $1}'
Идея очень проста.: каждое число после символа $ Это относится к соответствующему столбцу, всегда относительно текущего разделителя.
Изменяйте разделитель с помощью -F и с помощью FS.
Во многих системных файлах отсутствуют пробелы в качестве разделителей.но другими СимволыКлассика — это /etc/passwdгде поля разделены :Для обработки этого файла по столбцам у вас есть два варианта: вариант -F в командной строке или в переменной FS внутри блока BEGIN.
Использование параметра -F в командной строке:
cat /etc/passwd | awk -F ":" '{print $1}'
В этом примере отображаются только имена пользователей. (первое поле), потому что разделитель теперь :Если вам также нужны UID и GID (поля 3 и 4), просто:
cat /etc/passwd | awk -F ":" '{print $1, $3, $4}'
Проблема этой команды в том, что выходные данные сливаются воедино. Если вы не указали явные разделители, вы можете добавить пробелы или табуляцию вручную:
cat /etc/passwd | awk -F ":" '{print $1 " " $3 " " $4}'
Если вам нужен более подробный табличный результат.вы можете использовать \t Вставить табуляцию:
cat /etc/passwd | awk -F ":" '{print $1 "\t" $3 "\t" $4}'
Альтернативный вариант с использованием FS в блоке BEGIN. Это позволяет задать разделитель непосредственно в скрипте awk:
cat /etc/passwd | awk 'BEGIN { FS=":" } {print $1 "\t" $3 "\t" $4}'
Оба подхода функционально эквивалентны.хотя и используя BEGIN {FS=...} Как правило, лучше писать многократно используемые скрипты .awk.
FS и OFS: разделители входа и выхода
Помимо FS (Field Separator), в awk также присутствует OFS (Output Field Separator).который определяет, как поля разделяются при использовании print с запятыми:
cat /etc/passwd | awk 'BEGIN { FS=":"; OFS=" - " } {print $1, $3, $4}'
В этом случае вы читаете с помощью : но вы пишете с - , генерируя следующий результат:
root - 0 - 0
daemon - 1 - 1
...
Эта комбинация FS/OFS очень полезна для "переформатирования" данных.Например, для преобразования из одного формата в другой или для подготовки читаемых выходных данных, которые затем можно экспортировать в другую систему.
Получите последнее поле с помощью переменной $NF (и предыдущие).
Во многих результатах выполнения командИнтересующее вас поле находится в конце, но точное количество столбцов может варьироваться. Вот где оно находится. $NF (Количество полей) упрощает вам жизнь: это всегда последнее поле в текущей строке.
Например, в /etc/shells В конце каждой строки указаны допустимые пути к командной оболочке.Иногда во втором столбце, иногда в третьем и т. д. Чтобы вывести только имя оболочки (часть после последней косой черты):
awk -F "/" '/^\// {print $NF}' /etc/shells
Если вы хотите сохранить только уникальные значения, то... (без дубликатов), вы можете создавать цепочки с uniq:
awk -F "/" '/^\// {print $NF}' /etc/shells | uniq
А если вас интересует предпоследний элемент пути, то... (например, в предыдущей директории), вы можете использовать $(NF-1) o $(NF-2):
awk -F "/" '/^\// {print $(NF-1)}' /etc/shells
awk -F "/" '/^\// {print $(NF-2)}' /etc/shells
Фильтрация строк по шаблонам, длине и логическим условиям.
Awk особенно хорош, когда вам нужно сосредоточиться только на определенных строках. на основе текстовых шаблонов, определенных столбцов или числовых условий. Комбинируйте регулярные выражения, логические операторы и функции, такие как... length для создания очень точных фильтров.
Фильтрация по шаблонам и регулярным выражениям.
Самый прямой способ фильтрации по содержимому — заключить регулярное выражение между косыми чертами. Непосредственно перед клавишами:
awk '/patrón/ {print}' archivo.txt
Например, с уходом df Отображаются только строки, начинающиеся с косой черты (в смонтированных файловых системах):
df | awk '/^\// {print}'
Например, если вам нужен определенный раздел /dev/sda5:
df | awk '/^\/dev\/sda5/ {print}'
Также можно фильтровать по шаблонам в начале или конце строки. использование ^ y $:
awk '/^tmpfs/ {print}' archivo.txt
awk '/\/shm$/ {print}' archivo.txt
И объединить несколько критериев с помощью логического оператора. &&Например, строки, начинающиеся с tmpfs и заканчиваются в /dev/shm:
df | awk '/\/shm$/ && /^tmpfs/ {print}'
Отфильтруйте по столбцам и отобразите только то, что вас интересует.
Часто возникает необходимость фильтровать не только строки, но и столбцы.Продолжение df -hВы можете отображать только реальные файловые системы.^/) а затем сохранить столбцы 1, 2 и 3:
df -h | awk '/^\// {print $1 "\t" $2 "\t" $3}'
Awk даже позволяет работать с полями на лету.Например, сложите значения столбцов 2 и 3 (используемое + доступное), чтобы увидеть рассчитанную «общую вместимость»:
df -h | awk '/^\// {print $1 "\t" $2 + $3}'
Если вы хотите добавить буквенную единицу «G» в конец результата:
df -h | awk '/^\// {print $1 "\t" $2 + $3 "G"}'
Фильтрация по длине строки с помощью функции length()
Функция length() измеряет количество символов в строкеОбычно используется с $0 (полная строка), но вы также можете использовать его с определенным столбцом.
Чтобы показать только строки /etc/shells с более чем 9 символами:
awk 'length($0) > 9' /etc/shells
Если вы хотите увидеть длину каждой строки:
awk '{print length, "\t", $0}' /etc/shells
Вы также можете отфильтровать результаты по длине, а затем вывести только нужную длину.:
awk 'length($0) > 9 {print length}' /etc/shells
Объедините несколько условий с помощью && и if
Помимо использования регулярных выражений в началеВ блоке можно писать полные условия, используя ifоператоры сравнения и логические операторы.
Например, отображение только строк df -h которые начинаются с t и в шестом столбце которого содержится более 8 символов:
df -h | awk '/^t/ && length($6) > 8 {print $0}'
Другой типичный случай — поиск процессов по последнему полю. (команда выполнена) на выходе ps -efПоследнее поле — $NFТаким образом, вы можете использовать:
ps -ef | awk '{ if ($NF == "firefox") print $0 }'
Если вас интересует только PID и команда.:
ps -ef | awk '{ if ($NF == "firefox") print $2, $NF }'
Линии управления с указанием NR, диапазонов и длины поля.
Переменная NR (Number of Record — количество записей) Он подсчитывает, сколько строк было прочитано к настоящему моменту (глобально). Это позволяет выполнять такие распространенные действия, как пропуск заголовков, вывод определенных диапазонов строк или отображение только первой строки.
Подсчитайте строки и покажите только первую или вторую.
Чтобы подсчитать общее количество строк в файле без использования wc -l Вы можете сделать:
awk 'END {print NR}' archivo.txt
Если вы хотите распечатать только первую строку:
awk 'NR==1 {print}' archivo.txt
И показать только вторую строку:
awk 'NR==2 {print}' archivo.txt
Печать, начиная с определенной строки или диапазона.
Чтобы показать все строки, начиная с третьей, Вы можете использовать простое условие с > o >=:
ps -aux | awk 'NR>2 {print}'
Если вам нужен диапазон, например, строки со 2 по 4, то это может быть любой диапазон. en /etc/shells:
cat /etc/shells | awk 'NR==2, NR==4 {print $0}'
Вы также можете вывести номер строки рядом с содержимым.:
cat /etc/shells | awk 'NR==2, NR==4 {print NR, $0}'
Длина конкретных полей
Помимо измерения длины целых линийВы можете проверить длину определенного столбца. Например, чтобы узнать, сколько символов содержит файловая система (столбец 1) в выходных данных. df -h:
df -h | awk '{print length($1) "\t" $1}'
Если вы хотите пропустить заголовок (первая строка), добавляет NR>1:
df -h | awk 'NR>1 {print length($1) "\t" $1}'
Полезные функции: substr, match, RSTART и RLENGTH
Awk включает в себя хороший набор текстовых функций.Два наиболее мощных инструмента для расширенного поиска: substr y match, причем последний сопровождается переменными RSTART y RLENGTH.
Обрезать текст с помощью функции substr()
Функция substr(cadena, inicio) o substr(cadena, inicio, longitud) Это позволяет извлекать подстроки. Например, чтобы удалить первые 5 символов из каждой строки. /etc/shells:
cat /etc/shells | awk '{print substr($0, 5)}'
Если вы не хотите обрабатывать первую строку (например, комментарий), вы можете использовать NR:
cat /etc/shells | awk 'NR>1 {print substr($0, 5)}'
Обратите внимание, что первый параметр — это строка (обычно). $0) А второй параметр указывает, какого персонажа вы хотите начать показывать.
Поиск шаблонов с помощью функций match(), RSTART и RLENGTH
Функция match(cadena, /regex/) поиск регулярного выражения внутри строкиЕсли совпадение найдено, возвращается начальная позиция (начиная с 1) и заполняются две переменные:
RSTART: позиция, где начинается найденный узор.RLENGTH: продолжительность матча.
Например, для всех строк ps -aux которые содержат "процессор"Вы можете отобразить всю линию и положение, где расположен шаблон:
ps -aux | awk 'match($0, /cpu/) {print $0 " Contiene \"cpu\" en la posición " RSTART}'
Если вы также хотите узнать размеры найденного узора, просто используйте RLENGTH на выходе:
ps -aux | awk 'match($0, /cpu/) {print $0 " Posición=" RSTART " Longitud=" RLENGTH}'
Этот тип поиска широко используется в анализе текста и биоинформатике.Например, в файлах FASTA, где вас интересует поиск определенных мотивов в последовательностях.
Математические операции и переменные в awk
Awk не ограничивается отображением текста.: позволяет выполнять числовые операции непосредственно над полями, внутренними переменными или значениями, которые вы передаете из командной строки или из среды оболочки.
Определите переменные с флагом -vy и используйте их в строке BEGIN.
Вы можете объявлять переменные с помощью опции -v при запуске awkНапример, умножение двух фиксированных чисел:
awk -v a="10" -v b="20" 'BEGIN {print "La multiplicación de a x b es", a*b}'
Также можно передавать значения переменных из вашей оболочки.Если вы сделаете это в командной строке:
a=1.5
b=4
Затем вы можете использовать их в awk следующим образом::
awk -v a="$a" -v b="$b" 'BEGIN {print "La multiplicación de a x b es", a*b}'
Блок BEGIN используется здесь, потому что мы не обрабатываем никакие файлы.Мы хотим запустить код всего один раз и отобразить результат.
Математические функции: sqrt и циклы for.
Awk включает в себя несколько стандартных математических функций.Как sqrt() для извлечения квадратных корней. Например, квадратный корень из 400:
awk 'BEGIN {print sqrt(400)}'
Также его можно комбинировать с циклами for. Для создания полных списков:
awk 'BEGIN { for(i=1; i<=10; i++) print "La raíz cuadrada de", i*i, "es", i }'
Или перемещаться по десятичным значениям от 0 до 1 с небольшими приращениями.:
awk 'BEGIN { for(i=0; i<=1; i=i+0.00001) print "La raíz cuadrada de", i*i, "es", i }'
Подобные структуры делают awk очень похожим на традиционный язык.хотя его естественной средой обитания остается колонный формат.
Написание и запуск полноценных скриптов в awk
Когда команды awk начинают становиться слишком длинными Если вы хотите повторно использовать сложные преобразования, разумнее всего сохранить их в скриптовом файле с расширением . .awk (хотя это не обязательно).
Типичный пример включает обработку выходных данных df Отображать только те записи, которые соответствуют условиям по доступному пространству, и форматировать результаты в виде небольшой таблицы.
Представьте, что вы хотите следующее.:
- Отображать только файловые системы, имена которых начинаются с буквы «t». (Например,
tmpfs). - Отфильтруйте те, у которых доступная мощность (столбец 4) превышает 6000K..
- Выведите только единицу измерения (столбец 1) и сумму значений столбцов 2 и 3. в качестве приблизительной общей площади.
Вы можете создать скрипт под названием capacidad.awk с контентом, похожим на этот. (адаптировано и упрощено):
#!/usr/bin/awk -f
BEGIN { printf "%s\n", "Voy a extraer las partes que me interesan del comando df" }
BEGIN { printf "%s\t%s\n", "Unidad", "Capacidad disponible" }
/^t/ && $4 > 6000 {print $1 "\t" $2 + $3 "K"}
А затем выполните это, объединив выходные данные функции df.:
df | awk -f capacidad.awk
Если вы хотите улучшить внешний вид таблицывы можете заменить print по printf и использовать такие форматы, как %-12s (текст, выровненный по левому краю, длиной в 12 символов) или %-23d (Десятичное число в 23 символах). Это обеспечивает идеальный контроль над выравниванием по столбцам.
Найти и заменить текст с помощью функции gsub()
Awk также может выполнять замену текста. аналогично тому, как вы бы делали это с помощью sed, используя функцию gsub() (глобальный заменитель).
Общий синтаксис:
gsub("texto_o_regex_a_buscar", "texto_de_reemplazo", destino)
Например, предположим, что есть файл. geekland.txt с текстом «Geekland — лучший технологический блог», и вы хотите заменить начальную букву G на g:
awk '{ gsub("G", "g", $0); print $0 }' geekland.txt
Если третий параметр не указан, поиск выполняется по $0 по умолчаниюОднако очень часто замену ограничивают одним столбцом:
df -h | awk '{ gsub("M", "G", $2); print $2 }'
В данном случае мы изменили единицу измерения только с M на G во втором столбце.Если вы также хотите отобразить первый столбец с правильным выравниванием, вы можете объединить это с printf:
df -h | awk '{ gsub("M", "G", $2); printf "%-12s %-12s\n", $1, $2 }'
Такой подход заключается в том, что «я изменяю столбец, а затем печатаю отформатированный текст». Это чрезвычайно полезно при составлении отчетов, миграции данных или быстрой очистке вывода команд.
Дополнительные области применения: кошка, зараженная стероидами, и исполнение приказов.
Хотя это может показаться глупым.awk может выступать в качестве cat Улучшенная версия, позволяющая отображать файл и добавлять дополнительную информацию (номера строк, длина и т. д.).
Тривиальное применение заключалось бы в следующем::
awk '{print}' functions.php
Но вы также можете нумеровать строки или применять любые фильтры. без необходимости использования каких-либо дополнительных инструментов.
Ещё один интересный факт: awk может выполнять системные команды. по функции system()Например, чтобы отобразить текущий каталог:
awk 'BEGIN { system("pwd") }'
В простых скриптах это не самая распространенная практика.Но полезно знать о его существовании, когда вы создаёте более сложные инструменты на основе awk.
Awk превращается в универсальный инструмент для работы с текстом в Linux.Он позволяет фильтровать строки, выбирать и объединять столбцы, заменять фрагменты, измерять длину, находить закономерности, суммировать поля, создавать небольшие отформатированные отчеты и даже разрабатывать полноценные скрипты для обработки результатов работы других команд. Как только вы освоите его, он станет незаменимым инструментом при работе с... терминал и структурированные данные.
Страстный писатель о мире байтов и технологий в целом. Мне нравится делиться своими знаниями в письменной форме, и именно этим я и займусь в этом блоге: покажу вам все самое интересное о гаджетах, программном обеспечении, оборудовании, технологических тенденциях и многом другом. Моя цель — помочь вам ориентироваться в цифровом мире простым и интересным способом.