Полное руководство по использованию awk в Linux: пошаговое практическое руководство.

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

Учебное пособие по awk в Linux

Когда вы начинаете серьёзно относиться к консоли 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 выглядит следующим образом:

awk 'patrón { acción }' fichero

Каждая строка файла сравнивается с образцом.Если совпадение найдено, выполняется действие внутри фигурных скобок. Если шаблон опущен, действие применяется ко всем строкам. Несколько важных моментов:

Специальные переменные для ссылки на каждую строку:

  • $0: вся строка.
  • $1, $2, $3, …: поля (столбцы) строки, разделенные заданным разделителем.
  • NF: количество полей в текущей строке.
  • NR: текущий регистрационный номер (глобальный номер строки).
  • FNR: номер строки в текущем файле, полезно при обработке нескольких файлов.

Особые инструкции:

  • BEGIN { … }: блок, который выполняется до чтения какой-либо строки.
  • END { … }: блок, который выполняется после обработки всех строк.

Наиболее распространенные команды вывода:

  • print: выводит аргументы, разделенные разделителем вывода (OFS(по умолчанию — пробел).
  • printf: похожий на printf В языке C это позволяет выполнять детальное форматирование без добавления автоматических переносов строк.
  Как активировать и совершать видеозвонки в Instagram с помощью телефона или компьютера

Минимальный пример печати файла в точно таком виде, как если бы он был 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:

  Полное руководство по освоению команды powercfg в Windows

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 не ограничивается отображением текста.: позволяет выполнять числовые операции непосредственно над полями, внутренними переменными или значениями, которые вы передаете из командной строки или из среды оболочки.

  Как открыть и конвертировать файлы PKPASS в Windows

Определите переменные с флагом -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.Он позволяет фильтровать строки, выбирать и объединять столбцы, заменять фрагменты, измерять длину, находить закономерности, суммировать поля, создавать небольшие отформатированные отчеты и даже разрабатывать полноценные скрипты для обработки результатов работы других команд. Как только вы освоите его, он станет незаменимым инструментом при работе с... терминал и структурированные данные.

Запустить учебник Ancient Unix
Теме статьи:
Как запустить устаревшую версию UNIX на вашем ПК: SIMH, Docker, V7/V8, BSD и другие