DataLife Engine / Awk: Ваш секретный инструмент для работы с текстом в Linux

Awk: Ваш секретный инструмент для работы с текстом в Linux

Текст это сердце Unix. Философия "все есть файл" полностью пронизывает всю систему и  разработанные для нее инструменты. Вот почему работа с текстом является одним из обязательных навыков не только системного администратора, но и обычного пользователя Linux, который хочет поглубже разобраться в этой операционной системе.

Команда awk - один из самых мощных инструментов для обработки и фильтрации текста, доступный даже для людей никак не связных с программированием. Это не просто утилита, а целый язык разработанный для обработки и извлечения данных. В этой статье мы разберемся как пользоваться awk.

Синтаксис команды awk

Сначала надо понять как работает утилита. Она читает документ по одной строке за раз, выполняет указанные вами действия и выводит результат на стандартный вывод. Одна из самых частых задач, для которых используется awk - это выборка одной из колонок. Все параметры awk находятся в кавычках, а действие, которое надо выполнить - в фигурных скобках. Вот основной её синтаксис:

$ awk опции 'условие {действие}'

$ awk опции 'условие {действие} условие {действие}'

С помощью действия можно выполнять преобразования с обрабатываемой строкой. Об этом мы поговорим позже, а сейчас давайте рассмотрим опции утилиты:

Это далеко не все опции awk, однако их вам будет достаточно на первое время. Теперь перечислим несколько функций-действий, которые вы можете использовать:

Функций намного больше, но чтобы не загромождать статью я привел только те, которые мы будем использовать сегодня, а также ещё несколько для чтобы вы могли оценить масштаб возможностей утилиты.

В функциях-действиях можно использовать различные переменные и операторы, вот несколько из них:

Кроме этих переменных, есть и другие, а также можно объявлять свои.

Условие позволяет обрабатывать только те строки, в которых содержатся нужные нам данные, его можно использовать в качестве фильтра, как grep. А ещё условие позволяет выполнять определенные блоки кода awk для начала и конца файла, для этого вместо регулярного выражения используйте директивы BEGIN (начало) и END (конец). Там ещё есть очень много всего, но на сегодня пожалуй достаточно. Теперь давайте перейдем к примерам.

Использование awk в Linux

Простейшая и часто востребованная задача - выборка полей из стандартного вывода. Вы не найдете более подходящего инструмента для решения этой задачи, чем awk. По умолчанию awk разделяет поля пробелами. Если вы хотите напечатать первое поле, вам нужно просто использовать функцию print и передать ей параметр $1, если функция одна, то скобки можно опустить:

echo 'one two three four' | awk '{print $1}'

Awk: Ваш секретный инструмент для работы с текстом в Linux

Да, использование фигурных скобок немного непривычно, но это только в первое время. Вы уже догадались как напечатать второе, третье, четвертое, или другие поля? Правильно это $2, $3, $4 соответственно.

echo 'one two three four' | awk '{print $3}'

Awk: Ваш секретный инструмент для работы с текстом в Linux

Иногда необходимо представить данные в определенном формате, например, выбрать несколько слов. AWK легко справляется с группировкой нескольких полей и даже позволяет включать статические данные:

echo 'one two three four' | awk '{print $3,$1}'

Awk: Ваш секретный инструмент для работы с текстом в Linux

echo 'one two three four' | awk '{print "foo:",$3,"| bar:",$1}'

Awk: Ваш секретный инструмент для работы с текстом в Linux

Если поля разделены не пробелами, а другим разделителем, просто укажите в параметре -F нужный разделитель в кавычках, например ":" :

echo 'one mississippi:two mississippi:three mississippi:four mississippi' | awk -F":" '{print $4}'

Awk: Ваш секретный инструмент для работы с текстом в Linux

Но разделитель не обязательно заключать в кавычки. Следующий вывод аналогичен предыдущему:

echo 'one mississippi:two mississippi:three mississippi:four mississippi' | awk -F: '{print $4}'

Awk: Ваш секретный инструмент для работы с текстом в Linux

Иногда нужно обработать данные с неизвестным количеством полей. Если вам нужно выбрать последнее поле можно воспользоваться переменной $NF. Вот так вы можете вывести последнее поле:

echo 'one two three four' | awk '{print $NF}'

Awk: Ваш секретный инструмент для работы с текстом в Linux

Также вы можете использовать переменную $NF для получения предпоследнего поля:

echo 'one two three four' | awk '{print $(NF-1)}'

Awk: Ваш секретный инструмент для работы с текстом в Linux

Или поля с середины:

echo 'one two three four' | awk '{print $((NF/2)+1)}'

echo 'one two three four five' | awk '{print $((NF/2)+1)}'

Awk: Ваш секретный инструмент для работы с текстом в Linux

Все это можно сделать с помощью таких утилит как sed, cut и grep но это будет намного сложнее.

Как я рассказывал выше, awk обрабатывает одну строку за раз, вот этому подтверждение:

echo -e 'one 1n two 2' | awk '{print $1}'

Awk: Ваш секретный инструмент для работы с текстом в Linux

А вот пример фильтрации с помощью условия, выведем только строку, в которой содержится текст one:

echo -e 'one 1n two 2' | awk '/one/ {print $1}'

Awk: Ваш секретный инструмент для работы с текстом в Linux

 

А вот пример использования операций с переменными:

echo -e 'one 1n two 2' | awk '{sum+=$2} END {print sum}'

Awk: Ваш секретный инструмент для работы с текстом в Linux

Это означает что мы должны выполнять следующий блок кода для каждой строки. Это можно использовать, например, для подсчета количества переданных данных по запросам из журнала веб-сервера.

Представьте себе, у нас есть журнал доступа, который выглядит так:

Awk: Ваш секретный инструмент для работы с текстом в Linux

Мы можем подсчитать, что количество переданных байт, это десятое поле. Дальше идёт User-Agent пользователя и он нам не интересен:

cat /var/log/apache2/access.log | awk '{print $10}'

Awk: Ваш секретный инструмент для работы с текстом в Linux

Вот так можно подсчитать количество байт:

< requests.log awk '{totalBytes+=$NF} END {print totalBytes}'

Awk: Ваш секретный инструмент для работы с текстом в Linux

Это только несколько примеров показывающих использование awk в Linux , освоив awk один раз в получите очень мощный и полезный инструмент на всю жизнь.

11-10-2025, 22:31
Вернуться назад