Парсинг файлов с использованием AWK

05.10.2026
0
7
---

Одной из самых распространенных задач при работе в командной строке, помимо создания файлов и директорий, является обработка текстовых данных. Например, может потребоваться распарсить лог и получить количество IP-адресов, подсчитать количество вхождений определенного слова или обработать каждую строку CSV-файла по заданному алгоритму.

Большинство подобных задач можно решить с помощью стандартных утилит Linux, таких как cat, grep, wc, head, tail и других. Однако в некоторых случаях гораздо удобнее использовать AWK — командную утилиту для обработки и анализа текстовых данных.

В этой статье разберемся, что такое AWK, как работает команда awk и как с ее помощью парсить текстовые файлы в Linux.

Что такое AWK

AWK — это командная утилита для обработки и анализа структурированных текстовых данных. Она особенно удобна для работы с файлами, в которых информация разделена на отдельные поля, например /etc/passwd, CSV-файлами или логами.

Общий синтаксис запуска AWK выглядит следующим образом:

awk options program file

Здесь:

  • options — опции, передаваемые команде awk;

  • program — набор инструкций, который будет использоваться для обработки данных;

  • file — файл, который необходимо обработать.

Основные опции AWK

Наиболее часто используемые параметры AWK:

  • -F fs — позволяет указать символ или строку-разделитель для полей в каждой записи;

  • -f file — указывает имя файла, из которого необходимо прочитать инструкции AWK;

  • -v var=value — объявляет переменную и задает ей начальное значение.

Простой пример использования AWK

Рассмотрим простой пример обработки файла /etc/passwd. Каждая строка этого файла содержит несколько полей, разделенных символом :.

Наша задача — вывести только имя пользователя, то есть первое поле каждой строки:

cat /etc/passwd | awk -F ':' '{print $1}'

В результате получим примерно такой вывод:

root
daemon
bin
sys
sync
games
man
lp
mail
news
uucp
proxy
www-data
backup
list
irc
gnats
nobody
systemd-network
systemd-resolve
syslog
messagebus
_apt
uuidd
sshd
vozerov

С помощью команды cat мы выводим содержимое файла /etc/passwd и передаем весь вывод через конвейер (|) на вход команде awk.

Параметр -F ':' сообщает AWK, что каждую строку необходимо разделять по символу :. После этого конструкция:

{print $1}

выводит первое поле текущей строки.

В AWK поля обозначаются специальными переменными:

  • $1 — первое поле;

  • $2 — второе поле;

  • $3 — третье поле;

  • и так далее.

Переменная $0 содержит всю текущую строку целиком.

Несколько команд в одном AWK-скрипте

В AWK можно выполнять несколько команд, разделяя их точкой с запятой.

Например, следующая команда выведет первое и третье поля каждой строки:

cat /etc/passwd | awk -F ':' '{print $1; print $3}'

Здесь для каждой строки последовательно выполняются две команды:

print $1
print $3

Таким образом, AWK читает файл построчно и выполняет указанные инструкции для каждой строки.

Блоки BEGIN и END в AWK

Если необходимо выполнить какое-либо действие один раз до начала обработки файла или после обработки всех его строк, используются специальные блоки BEGIN и END.

Основной блок:

{ ... }

выполняется для каждой строки входных данных.

Блок:

BEGIN { ... }

выполняется один раз перед обработкой первой строки.

Блок:

END { ... }

выполняется один раз после обработки последней строки.

Блок BEGIN удобно использовать, например, для начальной установки переменных, а END — для вывода итоговой информации после обработки всего файла.

Подсчет количества строк с помощью AWK

Напишем простой пример, который подсчитывает количество строк в файле /etc/passwd:

cat /etc/passwd | awk 'BEGIN {a = 0} {a = a + 1} END {print a}'

Результат:

26

В этом примере происходит следующее:

  1. В блоке BEGIN переменная a устанавливается в 0.

  2. Основной блок {} выполняется для каждой строки файла.

  3. При обработке каждой строки значение a увеличивается на единицу.

  4. После обработки всех строк блок END выводит итоговое значение переменной a.

В данном случае основной блок был выполнен 26 раз — по количеству строк в файле.

Для подсчета строк также можно использовать встроенную переменную NR:

awk 'END {print NR}' /etc/passwd

Здесь NR содержит номер текущей обрабатываемой записи, поэтому после завершения обработки файла ее значение соответствует количеству обработанных строк.

Суммирование UID в файле /etc/passwd

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

Например, можно просуммировать все UID пользователей из файла /etc/passwd:

cat /etc/passwd | awk -F ':' 'BEGIN {a = 0} {a = a + $3} END {print a}'

Результат:

67508

В данном случае мы снова разделяем каждую строку /etc/passwd по символу :.

Третье поле $3 содержит UID пользователя. Полученное значение добавляется к переменной a.

Алгоритм работы команды выглядит следующим образом:

  1. В блоке BEGIN переменная a получает значение 0.

  2. Для каждой строки извлекается третье поле $3.

  3. Значение UID прибавляется к переменной a.

  4. После обработки всех строк блок END выводит итоговую сумму.

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

Условия if в AWK

Помимо работы с переменными и полями, AWK поддерживает условные конструкции if.

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

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

Например, можно вывести только пользователей, у которых UID больше определенного значения:

awk -F ':' '$3 > 1000 {print $1, $3}' /etc/passwd

В данном случае AWK проверяет третье поле каждой строки. Если значение $3 больше 1000, выводятся имя пользователя $1 и его UID $3.

AWK для обработки текстовых файлов

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

  • получения отдельных полей из строк;

  • подсчета количества строк;

  • подсчета и суммирования значений;

  • фильтрации данных по условиям;

  • обработки лог-файлов;

  • работы с CSV и другими структурированными текстовыми файлами;

  • автоматизации рутинной обработки данных в командной строке.

При этом AWK можно использовать как самостоятельно, так и совместно с другими командами Linux через конвейер |.

Например:

grep "ERROR" application.log | awk '{print $1}'

Такая конструкция позволяет сначала отобрать необходимые строки с помощью grep, а затем передать их в AWK для дальнейшей обработки.

Заключение

AWK — это удобная командная утилита для парсинга и обработки текстовых файлов в Linux. Она позволяет получать отдельные поля из строк, подсчитывать количество записей, выполнять арифметические операции, фильтровать данные и автоматизировать обработку текстовой информации непосредственно из терминала.

Большинство простых операций можно выполнить с помощью стандартных утилит Linux, таких как grep, cat, wc, head, tail и других. Однако когда задача становится сложнее, AWK позволяет выполнить обработку данных компактно и удобно.

Знание основных возможностей AWK — разделителей полей, переменных $1, $2, $3, блоков BEGIN и END, арифметических операций и условий if — позволяет эффективно работать с логами, конфигурационными файлами, CSV и другими текстовыми данными.

Понравиласть статья? Жми лайк или расскажи своим друзьям!
Теги к новости:
Linux, Ubuntu, Bash
Комментарии
Добавить комментарий
Добавление комментария
Ваше Имя:
Ваш E-Mail:
Это код:
Кликните на изображение чтобы обновить код, если он неразборчив
Введите сюда:
Похожие новости:
04.10.2026
Представлен новый релиз распределённой системы управления исходным кодом Git 2.56. В новую версию вошли 748 изменений, подготовленных при участии 104 разработчиков, в том числе 39 новых участников проекта. Исходный код Git распространяется под
05.10.2026
В bash (и других оболочках Unix) разница между командами export VAR="VALUE" и VAR="VALUE" связана с областью видимости переменной.
05.10.2026
QA (Quality Assurance) — обеспечение качества программного обеспечения. В рамках DevOps особенно важную роль играет SQA (Software Quality Assurance) — комплекс процессов и практик, направленных на проверку качества программного продукта. С
20.09.2025
Идемпотентность в Ansible — это принцип, согласно которому выполнение плейбука (или задачи) несколько раз не приведет к изменениям в системе, если система уже находится в нужном состоянии. То есть, если состояние системы после первого применения
08.09.2025
Раньше в Linux использовался SysVinit: скрипты запускались последовательно, зависшие службы нельзя было нормально отследить, логов в едином месте не было. Systemd появился в 2010-м и решил все эти проблемы. Сегодня он используется почти во всех