Awk linux что это
AWK — утилита предназначенная для простых, механических и вычислительных манипуляций над данными. Довольно несложные операции часто необходимо выполнить над целыми пакетами файлов, а писать для этого программу на одном из стандартных языков программирования является утомительным и, как правило, не очень простым делом. Оптимальное решение проблемы — использование специальной утилиты AWK , включающей в себя не громоздкий и удобный язык программирования, позволяющий решать задачи обработки данных с помощью коротких программ, состоящих из двух-трех строк.
Утилита AWK изначально объединяла свойства утилит UNIX — sed и grep . В дальнейшем ее возможности значительно расширились. Настоящая документация ограничивается описанием возможностей утилиты AWK реализованной для компьютеров CONVEX . Утилита AWK была создана в 1977г, американскими авторами: Alfred V.Aho , Brian W.Kernighan и Peter J.Weinberger . Подробное описание всех возможностей утилиты AWK для UNIX дает их издание: «The AWK Programming Language», 1988.
AWK сканирует input (стандартный или указываемый набор файлов), и над строками, удовлетворяющими заданному образцу, выполняет указываемые действия. Строка может содержать максимально до 256 символов.
awk [-Fc] [-f file] [files]
awk [-Fc] [prog] [files]
prog — программа, вида: ‘ образец $<$действие$>$ ‘
file — файл с AWK-программой:
files — файлы, предназначенные для AWK-обработки.
-Fc — устанавливает разделитель полей в «с» (См. 1.2.1 и 2.4)
2. Образец:
- Регулярное выражение;
- Выражение отношения;
- Комбинация образцов;
- BEGIN и END .
3. Действие:
- Последовательность предложений, разделенных « ; » или « \n » (новая строка)
Предложение:
- Вывод (Печать);
- Присваивание;
- Встроенная функция;
- Управляющая структура.
На поля можно ссылаться из AWK программы следующим образом:
- $1 — Первое поле;
- $2 — Второе поле;
- . и так далее.
- $0 — Ссылается на всю строку целиком.
Строка может содержать максимально до 100 полей.
< Drawing or tabular insertion skipped. >
x = 1 , x воспринимается как число;
x = » » , x — строка;
x + «abc» — результат операции интерпретируется как число независимо от того, было ли х числом или строкой. Если строка не может быть интерпретирована как число ( «abc» ), то ее значение становится 0.
Строка может содержать максимально до 256 символов.
$1 = «3» + $2 — первое поле принимает значение второго поля, увеличенного на 3.
$(i+1) — интерпретируется как поле, номер которого зависит от значения переменной i .
x[NR] = $0 — элементу массива x , индексированному NR , присваивается обрабатываемая строка.
x[«apple»] — элементы массива могут индексироваться не числовым значением, т.е. строкой.
- «( )» — Скобки допускаются для группирования;
- » |» — Указание альтернативы «или»;
- » + » — Плюс, стоящий за регулярным выражением означает любую последовательность вхождений этого выражения, начиная с 1;
- » ? » — Знак вопроса за регулярным выражением означает 0 или 1 вхождений этого выражения;
- [A-Z] — Допускается сокращенная форма записи для рангов ASCII символов;
- Установленный порядок выполнения операторов на одном скобочном уровне: «[] * + ? конкатенация |» .
/Olga/ — Указывает на строки, содержащие Olga .
/[Oo]lga|[Mm]ike|[Mm]al/ — Указывает на строки, содержащие Olga или olga или Mike или mike или Mal или mal .
/number9/ — Указывает на строки, содержащие number0 или number1 или . number9 .
/\/.+\// — Указывает на строки, содержащие любое количество символов, больше или равное 1, заключенных в / / .
Лог. Операция: < , < = , == , != , > = , > .
/[Oo]lga/ — Указывает на строки, первое поле которых содержит Olga или olga .
$1 > = «s» — Указывает на строки, начинающиеся с символа s или следующих за ним по порядку: t , u , v .
Последовательности образцов, соединенных одним из знаков читаются слева направо.
Комбинация: «образец1, образец2» указывает, что действие выполняется над строками, попадающими в указанный ранг: то есть, начиная от строки, удовлетворяющей «образец1″ и вплоть до строки, удовлетворяющей «образец2″, включая ее саму.
/\.su/) — Указывает на строки, содержащие 02.95 и не имеющие .su одновременно в первом и во втором поле.
NR == 100, NR == 200 — Указывает строки с номерами от 100 до 200.
Образец BEGIN указывает на начало input или на те действия, которые должны быть выполнены до какого бы то ни было анализа строк. Образец END указывает на конец input или на те действия, которые должны быть выполнены после обработки всех строк.
BEGIN
END < print NR >— Печатает номер последней строки input , т.е. количество обработанных входных строк.
PRINT [< список выражений > ] [ > < выражение1 > ]
Если в списке выражения находятся через запятую, то значения этих выражений выводятся на output (печатаются) через символ-разделитель OFS (по умолчанию пробел). Если же выражения стоят через пробел, то на печати происходит их конкатенация.
Значение < выражения1 > рассматривается как имя файла. Само его присутствие означает печать в файл. Если вместо « > » стоит « > > », то это означает добавление к уже существующему файлу. Можно использовать в одной программе максимально до 10 output файлов.
Оператор форматированной печати:
PRINTF формат [ ,список выражений ] [ > выражение1 ]
формат: символьная строка в двойных кавычках. Идентичен формату, используемому в функции printf в языке «С». Формат может содержать:
- обычные символы, они копируются на output .
- esc последовательности, представляющие неграфические символы, например, «\n» — новая строка.
- спецификации для вывода аргументов, они следуют после символа « % ». Число спецификаций должно быть равно числу аргументов. (Если оно меньше числа аргументов, то лишние аргументы игнорируются, если же больше — то это ошибка)
< переменная > = < выражение >
Начальное значение переменной 0 или « » (пробел). Допускаются другие типы присваивания в соответствии с языком «С»: «+=» , «-=» , «*=» , «/=» , «%=» .
< переменная > ++ , ++< переменная > — увеличение значения переменной на 1.
< переменная > — , —< переменная > — уменьшение значения переменной на 1.
length(arg) — Функция длины arg . Если arg не указан, то выдает длину текущей строки.
exp(),log(),sqrt() — Математические функции экспонента, логарифм и квадратный корень.
int() — Функция целой части числа.
substr(s,m,n) — Возвращает подстроку строки s , начиная с позиции m , всего n символов.
index(s,t) — Возвращает начальную позицию подстроки t в строке s . (Или 0, если t в s не содержится.)
sprintf(fmt,exp1,exp2. ) — Осуществляет форматированную печать (вывод) в строку, идентично PRINTF .
split(s,array,sep) — Помещает поля строки s в массив array и возвращает число заполненных элементов массива. Если указан sep , то при анализе строки он понимается как разделитель.
if ( < условие > ) < предложение >
\hskip 1cm [else < предложение > ]
while ( < условие > ) < предложение >
\hskip 1cm < предложение >
for(i=1; i< =NF; i++) — Аналогично циклу for в языке «С»
for (i in array) — Цикл по элементам массива. Но, элементы массива доступны в этом случае в случайном порядке.
break — Немедленный выход из цикла.
continue — Переход к выполнению следующего предложения.
next — Немедленный переход к анализу следующей строки.
exit — Выход из программы (на конец input).
Источник
Использование 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.
Источник