Использование awk в Linux.
.Основным средством представления данных а также взаимодействия пользователя с системой в Linux является текст или текстовые данные. Как известно, управление операционной системой (ОС) Linux осуществляется, преимущественно, через терминал консоли командной оболочки, локальный или удалённый. Даже в самых современных дистрибутивах Linux, имеющими на борту удобные графические оболочки, всё же без использования командной оболочки не обойтись. Так уж сложилось исторически, поскольку создатели системы UNIX, чьим потомком является Linux, ещё на начальных этапах разработки системы старались всячески облегчить работу в командной оболочке и повысить «производительность труда» при работе с ней — ведь это напрямую связано с обработкой текстовых данных, начиная с ввода команд и редактирования файлов и заканчивая управлением потоками ввода/вывода.
В результате система совершенствовалась и дополнялась специализированными утилитами, которые способны ускорить, причём очень существенно, скорость и эффективность работы с текстовыми данными. Одной из таких утилит является awk — в общем случае текстовый фильтр для сортировки, выборки и даже программирования управления текстовыми данными. Благодаря таким инструментам и некоторым хитростям использования командной оболочки опытный пользователь способен без использования графических пользовательских интерфейсов (GUI) управлять системой и данными заметно быстрее и эффективнее нежели при задействовании всевозможных графических приложений.
Как работает awk?
На самом деле awk – это изначально язык программирования, предназначенный для обработки текста/данных. Поскольку, как уже отмечалось, в Linux-системах основной средой для взаимодействия между пользователем и машиной является текст, то обработка достаточно больших его объёмов вручную способна была парализовать на некоторое время процесс выполнения основной работы. Требовался инструмент для обеспечения автоматической обработки данных и позволяющий использовать эту возможность «на лету», т. е. прямо при работе в командной оболочке. Лучшим средством для достижения этой цели является использование специализированного языка программирования и регулярных выражений, которое реализовано в виде одноимённой утилиты — команды awk.
Справедливо заметить, что awk – это прежде всего Си-подобный язык программирования, но для удобства понимания, под awk принято понимать утилиту или команду. Разработчиками языка AWK являются Alfred V. Aho, Peter J. Weinberger и Brian W. Kernighan, по сокращённым инициалам которых язык и получил своё название. Создан язык в 1977 году. Кстати, на основе AWK когда-то был создан язык Perl, который и по сей день является одним из самых мощных языков для высокопроизводительной обработки данных.
В качестве исходных данных awk принимает на вход строку и после её обработки в зависимости от конкретных опций выдаёт результат. Исходные данные могут поступать из файла или из вывода другой команды/программы. Самым распространённым случаем использования awk является выборка определённых столбцов из результата вывода других команд, например:
В результате вывод будет примерно таким:
Следует напомнить, что по-умолчанию вывод команды ll выглядит следующим образом:
Как видно, команда awk помогла вывести только отдельный столбец из общего вывода ll – с именами каталогов и файлов.
Конечно, для решения подобных задач существует утилита grep, но awk гораздо быстрее и производительнее для обработки больших и сложных массивов данных.
Синтаксис
Для awk существуют понятия команды и действий, выполняемых этой командой. Действия, которые необходимо выполнить, заключаются в фигурные скобки <>, а сама команда (в которую и входят действия) содержится в одинарных кавычках ‘ ‘:
Несколько действий разделяются (в соответствии с семантикой языка AWK) символом точки с запятой.
Следующая команда выведет весь файл file.txt подобно команде cat
Вывод строки содержащую ‘string’
Оператор print принимает выражения $0, $1, $2… Эти выражения указывают какие поля следует выводить, например. Оператор $0 выведет весь файл. Например
Аналогично awk ‘
Если нам нужно получить только первый столбец
Второй awk ‘
Следующие примеры демонстрируют использование awk в самых распространённых ситуациях:
В результате будет выведен список с именами установленных пакетов. Если же нужно узнать, к примеру, какие пакеты PHP или Apache установлены в системе. Следует дать команду:
Выражение для поиска/сортировки/отбора заключается, как можно видеть, между символами /’ ‘/.
Примеры использования awk
Для лучшего понимания стоит рассмотреть некоторые примеры использования утилиты awk. Для вывода/печати конкретных (например, второго и четвёртого) столбцов:
Вывести все столбцы:
Вывод элементов третьего столбца, в наименовании которых содержится паттерн /’pattern’/:
Напечатать количество строк в файле:
где NR – Number of Rows, т. е. количество строк. Для задания регулярных выражений:
Здесь отбору подлежат все пункты в первом столбце, имена которых начинаются на «P».
Здесь обратное условие, определяемое символом «!», т. е. выбраны будут все пункты из первого столбца и имена которых не начинаются на «P».
Следующая команда выводит количество байтов всех файлов, которые последний раз изменялись в октябре:
По умолчанию в качестве разделителя используется пробел или табуляция. Для того что бы задать свой разделитель нужно использовать ключ «-F». Например для получения списка всех пользователей системы выполните команду
Если бы мы запустили утилиту без указания разделителя, то вывод был бы таким
Конечно же, в приведённых примерах демонстрируются далеко не все возможности awk. Однако для эффективной работы в командной оболочке Linux, да и вообще с системой вышеприведённых примеров вполне достаточно. Поскольку они показывают общие принципы построения команд и действий для awk. Что позволяет создавать конкретные и более сложные конструкции в зависимости от конкретной задачи. Для более глубокого и масштабного использования утилиты awk. Рекомендуется посвятить некоторое время на изучения самого языка AWK.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Источник
Использование языка AWK для работы с текстом в Linux
Утилиты Linux часто повторяют принципы работы Unix. Инструменты стремятся к простоте, используют обычные текстовые файлы для ввода и вывода данных и работают по модульному принципу. Такое подражание также предоставляет огромные функциональные возможности обработки текста с помощью инструментов sed и awk.
Данное руководство описывает использование awk. Awk – это одновременно язык програмирования и текстовый процессор, предоставляющий несколько очень удобных способов обработки текстовых данных. Все примеры были выполнены на Ubuntu 12.04 VPS, но любая современная система Linux должна работать таким же образом.
Основной синтаксис
Команда awk включена во все современные дистрибутивы Linux по умолчанию, ее не нужно устанавливать.
Лучше всего аwk справляется с файлами, отформатированными предсказуемым образом. К примеру, эта команда особенно сильна в анализе и обработке табличных данных. Она работает путем построчного разбора всего файла.
По умолчанию для разделения полей она использует пробельные символы и символы табуляции. К счастью, большинство систем Linux используют такой формат.
Базовый формат команды awk:
Поисковый шаблон или действие можно опустить. Если действие не указано, по умолчанию команда awk выведет результат на экран, то есть, просто выведет все совпавшие с шаблоном строки.
Если был пропущен шаблон, awk выполнит указанное действие для всех строк.
Если обе части были указаны, awk использует поисковый шаблон, чтобы вывести совпавшие с ним строки, а затем выполняет над этими строками указанное действие.
Основы работы с awk
В своей простейшей форме awk, как и cat, просто выводит все строки текстового файла на экран.
Для примера попробуйте вывести файл fstab, содержащий список существующих файловых систем:
awk ‘
# /etc/fstab: static file system information.
#
# Use ‘blkid’ to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
#
proc /proc proc nodev,noexec,nosuid 0 0
# / was on /dev/vda1 during installation
UUID=b96601ba-7d51-4c5f-bfe2-63815708aabd / ext4 noatime,errors=remount-ro 0 1
Как видите, команда просто вывела все строки файла, что не очень удобно. К счастью, awk обладает широкими возможностями фильтрации поиска:
awk ‘/UUID/’ /etc/fstab
# device; this may be used with UUID= as a more robust way to name devices
UUID=b96601ba-7d51-4c5f-bfe2-63815708aabd / ext4 noatime,errors=remount-ro 0 1
Как видите, теперь awk вывела только строки, содержащие последовательность «UUID». Можно также избавиться от посторонних строк, указав, что последовательность «UUID» должна быть расположена в самом начале строки:
awk ‘/^UUID/’ /etc/fstab
UUID=b96601ba-7d51-4c5f-bfe2-63815708aabd / ext4 noatime,errors=remount-ro 0 1
Аналогичным образом можно использовать часть «действие», чтобы указать, какую именно информацию нужно вывести. К примеру, чтобы вывести только первый столбец, наберите:
awk ‘/^UUID/
UUID=b96601ba-7d51-4c5f-bfe2-63815708aabd
Также можно сослаться на каждый столбец (разделены пробелами) с помощью переменных, связанных с номером столбца. Так, на первый столбец можно сослаться, набрав $1; чтобы сослаться на всю строку, используйте $0.
Встроенные переменные и расширенный формат awk
Awk использует некоторые встроенные переменные, чтобы определять фрагменты информации при обработке текста.
Список встроенных переменных awk:
- FILENAME: ссылается на текущий входной файл.
- FNR: Ссылается на номер текущей записи относительно текущего вводного файла. Например, если в данный момент открыто два вводных файла, команда выведет номер записи каждого из них.
- FS: текущий разделитель полей, который используется для обозначения каждого поля в записи. По умолчанию установлен пробел.
- NF: количество полей в текущей записию
- NR: номер текущей записи.
- OFS: разделитель полей для выводимых данных. По умолчанию установлен пробел.
- ORS: разделитель записей для выводимых данных. По умолчанию установлен символ новой строки.
- RS: разделитель записей, отделяющий записи во входном файле. По умолчанию это символ новой строки.
Значения этих переменных можно менять в соответствии с потребностями файлов. Обычно это делается во время инициализации обработки awk.
В целом, синтаксис awk немного более сложный, чем кажется сначала. Кроме того, он содержит дополнительные блоки BEGIN и END, которые могут содержать команды, которые нужно выполнить перед или после обработки файла соответственно.
Расширенный синтаксис выглядит примерно так:
Ключевые слова BEGIN и END, на самом деле, просто конкретные совокупности условий, так же, как и параметры поиска. Они совпадают до и после обработки документа.
Это значит, что некоторые переменные блока BEGIN можно изменить. К примеру, файл /etc/passwd разделён с помощью исмволов двоеточия (:), а не пробелов. Чтобы вывести первый столбец этого файла, можно использовать:
Блоки BEGIN и END можно использовать, чтобы получить простую информацию о выведенных полях:
Как видите, воспользовавшись некоторыми функциями awk, можно достаточно гибко отформатировать некоторые параметры.
Оба блока расширения – необязательны. По сути, основные действия тоже необязательны, если другая часть действий уже указана. К примеру, с awk можно работать так:
awk ‘BEGIN < print "We can use awk like the echo command"; >‘
We can use awk like the echo command
Условные операторы и поиск по полям
В одном из приведенных выше примеров в файле /etc/fstab была найдена последовательность «UUID». Это было просто, так как нужно было найти строку, содержащую эту последовательность в начале.
Но что, если нужно найти последовательность, расположенную в начале поля?
Можно создать тестовый файл favorite_food.txt, содержащий пронумерованный список любимых продуктов группы друзей.
echo «1 carrot sandy
2 wasabi luke
3 sandwich brian
4 salad ryan
5 spaghetti jessica» > favorite_food.txt
Чтобы вывести все слова, начинающиеся с «sa», используйте:
awk ‘/sa/’ favorite_food.txt
1 carrot sandy
2 wasabi luke
3 sandwich brian
4 salad ryan
В выведенном результате показаны не только слова, начинающиеся с последовательности «sa». Это касается слова «wasabi», которое содержит нужную последовательность в середине; кроме того, слово «sandy» также не совсем соответствует шаблону, так как находится в другом столбце. Нужно вывести только слова, которые начинаются с «sa» во втором столбце.
Чтобы сделать это, наберите:
/^sa/’ favorite_food.txt
3 sandwich brian
4 salad ryan
Как видите, это работает должным образом.
Символ «^» говорит awk ограничить поиск началом поля. Часть «field_num
» указывает, что искать нужно только во втором столбце.
Вывести последовательности, которые не совпадают с шаблоном, можно при помощи символа «!», указанного перед тильдой (
). Данная команда выведет все строки, которые не начинаются с «sa».
/^sa/’ favorite_food.txt
1 carrot sandy
2 wasabi luke
5 spaghetti jessica
Чтобы вывести строки, для которых верно предыдущее выражение и порядковый номер которых меньше 5, используйте условный оператор:
Это выполняет несколько новых действий. Так, оператор && дает возможность задавать дополнительные требования. Таким образом можно объединить произвольное количество условий для поиска нужной строки.
Этот оператор используется для того, чтоб проверить, что значение первого столбца меньше, чем 5.
Заключение
Данное руководство дает общее представление о том, как awk может управлять, форматировать и выборочно выводить текстовые файлы. Тем не менее, работа с Awk – достаточно широкая тема, ведь на самом деле это целый язык программирования, дополненый функциями присвоения переменных, управляющими структурами, встроенными функциями и т.п. Его можно использовать для быстрого и удобного форматирования текста скриптов.
Получить больше информации о работе awk, а также ознакомиться с gawk, современной GNU-версией awk, можно на специальных онлайн-ресурсах.
Источник