Парсинг файлов с использованием AWK
Одной из самых распространенных задач при работе в командной строке, помимо создания файлов и директорий, является обработка текстовых данных. Например, может потребоваться распарсить лог и получить количество 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
В этом примере происходит следующее:
-
В блоке
BEGINпеременнаяaустанавливается в0. -
Основной блок
{}выполняется для каждой строки файла. -
При обработке каждой строки значение
aувеличивается на единицу. -
После обработки всех строк блок
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.
Алгоритм работы команды выглядит следующим образом:
-
В блоке
BEGINпеременнаяaполучает значение0. -
Для каждой строки извлекается третье поле
$3. -
Значение UID прибавляется к переменной
a. -
После обработки всех строк блок
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 и другими текстовыми данными.


