Язык обработки данных awk


Содержание

Примеры команды AWK в Linux

Введение

AWK назван в честь фамилии его авторов: Альфред Ахо, Питер Вайнбергером и Брайан Керниган. AWK очень полезный язык сценариев для обработки текста. Этот язык выполняется в интерпретаторе. Это позволяет пользователю обрабатывать некоторые входные, определять переменные, использовать логические операторы, строки и числовые функции, извлечения данных и создания отформатированных отчетов. Синтаксис AWK очень близок с языку C и является прямым предшественником Perl. Все сценарии AWK могут быть преобразованы в сценарии Perl с использованием утилиты A2P.

Предпосылки

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

Установка

Для того, чтобы установить утилиту командной строки AWK на CentOS/Fedora или на любую другую на основе RPM распределения Linux, выполните следующую команду:

В Ubuntu/Debian, вам нужно вызвать эту команду, чтобы установить Gawk:

Примеры команды AWK

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

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

Это очень полезно, если вы расследуете, находиться ли ваш сервер под атакой DoS или DDoS.

В следующем примере мы используем AWK для поиска конкретного шаблона в определенных столбцах и делаем какое-то действие, на основе результата:

Выше команда удалит все замороженные сообщения электронной почты из почтовой очереди Exim.

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

Следующая команда напечатает пять случайных чисел от 0 до 999:

Используйте следующую команду, чтобы подсчитать количество строк в файле с именем «sample_file»:

Следующая команда выведет все строки в файле «sample_file», которые содержат строки, начинающиеся с ‘ A ‘ или ‘a’, за которыми следует ‘ re’:

Вы можете использовать команду AWK для более сложных операций. Если ваш веб-сайт работает довольно медленно, вы можете использовать следующую команду, чтобы проверить, есть ли какая-то проблема с диском I/O (и/или сети, в некоторых редких случаях):

IOWAIT означает, как долго процессы блокируются занятые вводом/выводом, в основном дискового хранения или, возможно, сети. STEAL означает, как долго процессы блокируются удачей CPU Time slice на сервере. Выше iowait на время процессора пользователя (=USER + NICE + SYSTEM) показывает занят ввода / вывода, выше украсть просматривается показывает занят CPU.

Следующий сценарий использует простую команду awk, которая выполняет поиск во входном файле ‘/etc/passwd ‘ и предоставляет вывод с именем пользователя, за которым следует дата и время последнего входа:

Сделайте скрипт исполняемым:

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

Вывод

Есть некоторые новые языки, такие как Perl и Python, которые могут быть использованы вместо AWK, но использование AWK имеет ряд преимуществ, так как:

  • AWK очень легко узнать.
  • AWK может быть использован для решения определенных типов задач быстрее и создавать более эффективные сценарии, чем при использовании других инструментов/языков.
  • AWK очень удобен при работе с большими файлами, как журналы и т.д., потому что с помощью команды/скрипа AWK вы можете создать отфильтрованный и удобочитаемый отчет.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Часть 1. Awk в примерах

Введение в замечательный язык со странным именем

Серия контента:

Этот контент является частью # из серии # статей: Common threads

Этот контент является частью серии: Common threads

Следите за выходом новых статей этой серии.

В защиту awk

В этой серии статей я собираюсь сделать из читателя искусного программиста на awk. Я согласен, что у awk не самое приятное и модное имя, а GNU-версия awk, названная gawk, звучит откровенно странно. Незнакомые с этим языком программисты, услышав его название, возможно, представят себе мешанину древнего и устаревшего кода, способного довести до умопомрачения даже самого знающего специалиста по UNIX (заставив его восклицать «kill -9!» и беспрестанно бегать за кофе).

Да, у awk отнюдь не замечательное имя. Но это замечательный язык. Awk создан для обработки текста и создания отчетов, но у него много хорошо проработанных функций, дающих возможность серьезного программирования. При этом, в отличие от некоторых других языков, синтаксис awk привычен и заимствует лучшее из таких языков, как C, python и bash (хотя формально awk был создан до python и bash). Awk — один из тех языков, которые, будучи один раз выучены, становятся ключевой частью стратегического арсенала программиста.

Первый шаг в awk

Давайте начнем и попробуем поэкспериментировать с awk, чтобы увидеть, как он работает. В командной строке введем следующую команду:

В результате должно быть показано содержимое файла /etc/passwd. Теперь — объяснение того, что делал awk. Вызывая awk, мы указали /etc/passwd в качестве входного файла. Когда мы запустили awk, он обработал команду print для каждой строки в /etc/passwd по порядку. Весь вывод отправлен в stdout, и мы получили результат, идентичный результату команды cat /etc/passwd. Теперь объясним блок < print >. В awk фигурные скобки используются для группирования блоков текста, как в C. В нашем блоке текста есть лишь одна команда print. В awk команда print без дополнительных параметров печатает все содержимое текущей строки.

Вот еще один пример программы на awk, которая делает то же самое:

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

При передаче строки «» команде print она всегда печатает пустую строку. Если протестировать этот скрипт, обнаружится, что awk выводит одну пустую строку на каждую строку в файле /etc/passwd. Это опять-таки происходит потому, что awk исполняет скрипт для каждой строки во входном файле. Вот еще один пример:

Если запустить этот скрипт, он заполнит экран словами «ура». :)

Множественные поля


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

В вызове awk в вышеприведенном примере параметр –F задает «:» в качестве разделителя полей. Обрабатывая команду print $1, awk выводит первое поле, встреченное в каждой строке входного файла. Вот еще один пример:

Вот фрагмент из вывода на экран этого скрипта:

Как видим, awk выводит первое и третье поля файла /etc/passwd, которые представляют собой соответственно поля имени пользователя и uid. При этом, хотя скрипт и работает, он не совершенен — нет пробелов между двумя выходными полями! Те, кто привык программировать в bash или python, возможно ожидали, что команда print $1 $3 вставит пробел между этими двумя полями. Однако когда в программе на awk две строки оказываются рядом друг с другом, awk сцепляет их без добавления между ними пробела. Следующая команда вставит пробел между полями:

Когда print вызывается таким способом, он последовательно соединяет $1 , » » и $3 , создавая удобочитаемый вывод на экране. Конечно, мы можем также вставить метки полей, если нужно:

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

Внешние скрипты

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

Размещение скриптов в отдельных текстовых файлах также позволяет воспользоваться дополнительными преимуществами awk. Например, следующий многострочный скрипт делает то же самое, что и один из наших предыдущих однострочных — распечатывает первое поле каждой строки из /etc/passwd:

Разница между этими двумя методами состоит в том, как мы задаем разделитель полей. В этом скрипте разделитель полей указывается внутри самой программы (установкой переменной FS), тогда как в нашем предыдущем примере FS настраивается путем передачи awk параметра -F»:» в командной строке. Обычно лучше всего задавать разделитель полей внутри самого скрипта, просто потому, что тогда не потребуется запоминать ещё один аргумент командной строки. Позже в этой статье мы рассмотрим переменную FS более подробно.

Блоки BEGIN и END

Обычно awk выполняет каждый блок в тексте скрипта один раз для каждой входной строки. Однако в программировании часто встречаются ситуации, когда требуется выполнить код инициализации перед тем, как awk начнет обрабатывать текст из входного файла. Для таких случаев awk дает возможность определять блок BEGIN. Мы использовали блок BEGIN в предыдущем примере. Поскольку блок BEGIN обрабатывается до того, как awk начинает обрабатывать входной файл, это отличное место для инициализации переменной FS (разделитель полей), вывода заголовка или инициализации других глобальных переменных, которые будут позже использоваться в программе.

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

Регулярные выражения и блоки

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

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

Выражения и блоки

Есть много других способов избирательно выполнять блок программы. Мы можем поместить перед блоком программы любое булево выражение для управления исполнением этого блока. Awk будет выполнять блок программы, только если предыдущее булево выражение равно true. Следующий пример скрипта будет выводить третье поле всех строк, в которых первое поле равно fred . Если первое поле текущей строки не равно fred , awk продолжит обработку файла и не выполнит оператор print для текущей строки: :

Awk предлагает полный набор операторов сравнения, в том числе обычные «==», » «, » =» и «!=». Кроме того, awk предоставляет операторы «

«, которые означают «совпадает» и «не совпадает». При их использовании переменная помещается слева от оператора, а регулярное выражение — справа от него. Вот пример, где выводится только третье поле строки, если пятое поле той же строки содержит символьную последовательность root :

Условные операторы

Awk предоставляет также очень приятные C-подобные операторы if. При желании можно переписать предыдущий скрипт с использованием if :

Оба скрипта работают идентично. В первом примере булево выражение находится вне блока, в то время как во втором примере блок выполняется для каждой входной строки, и мы избирательно выполняем команду печати, используя оператор if Оба метода работают, и выбрать можно тот, который наилучшим образом объединяется с другими частями скрипта.

Вот более сложный пример оператора if в awk. Как можно видеть, даже в случае сложных вложенных условных выражений операторы if выглядят идентично их аналогам в C:

Используя операторы if, мы можем преобразовать этот код:

Оба скрипта распечатают только те строки, которые не содержат символьную последовательность matchme . И в этом случае тоже можно выбрать метод, который лучше работает в конкретной программе. Они оба делают одно и то же.

Awk также дает возможность использовать булевы операторы «||» («логическое ИЛИ») и «&&»(«логическое И»), что позволяет создавать более сложные булевы выражения:

Этот пример выведет только те строки, в которых первое поле равно foo и второе поле равно bar .

Числовые переменные!

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

В блоке BEGIN мы инициализируем нашу целочисленную переменную x значением ноль. Затем каждый раз, когда awk встречает пустую строку, он будет выполнять оператор x=x+1 , увеличивая x на 1. После того как все строки будут обработаны, будет выполнен блок END, и awk выведет конечный итог, указав число найденных пустых строк.

Строчные переменные

Одной из приятных особенностей переменных awk является то, что они «простые и строчные.» Я называю переменные awk «строчными», потому что все переменные awk внутри хранятся как строки. В то же время переменные awk «простые», потому что с переменной можно производить математические операции, и если она содержит правильную числовую строку, awk автоматически позаботится о преобразовании строки в число. Чтобы понять, что я имею в виду, взглянем на этот пример:

Любопытно! Хотя мы присвоили переменной x строковое значение 1.01, мы все же смогли прибавить к ней единицу. Нам бы не удалось сделать это в bash или python. Прежде всего, bash не поддерживает арифметику с плавающей запятой. И, хотя в bash есть «строчные» переменные, они не являются «простыми»; для выполнения любых математических операций bash требует, чтобы мы заключили наши вычисления в уродливые конструкции $( ) . Если бы мы использовали python, нам бы потребовалось явно преобразовать нашу строку 1.01 в значение с плавающей запятой, прежде чем выполнять какие-либо расчеты с ней. Хоть это и не трудно, но это все-таки дополнительный шаг. В случае с awk все это делается автоматически, и это делает наш код красивым и чистым. Если бы нам потребовалось возвести первое поле каждой входной строки в квадрат и прибавить к нему единицу, мы бы воспользовались таким скриптом:

Если немного поэкспериментировать, то можно обнаружить, что если в какой-то переменной не содержится правильного числа, awk при вычислении математического выражения будет обращаться с этой переменной как с числовым нулем.

Множество операторов

Еще одна приятная особенность awk — это полный комплект математических операторов. Кроме стандартных сложения, вычитания, умножения и деления, awk дает нам возможность использовать ранее продемонстрированный оператор показателя степени «^», оператор остатка целочисленного деления «%» и множество других удобных операторов присваивания, заимствованных из C.

К ним относятся пред- и постинкрементные/декрементные операторы присваивания ( i++, —foo ), операторы присваивания со сложением/вычитанием/умножением/делением ( a+=3, b*=2, c/=2.2, d-=6.2 ). Но это ещё не все — мы имеем также удобные операторы присваивания с вычислением остатка целочисленного деления и возведением в степень ( a^=2, b%=4 ).

Разделители полей

В awk есть свой собственный комплект специальных переменных. Некоторые из них дают возможность тонкой настройки работы awk, а другие содержат ценную информацию о вводе. Мы уже затронули одну из этих специальных переменных, FS. Как упоминалось ранее, эта переменная позволяет задать последовательность символов, которую awk будет считать разделителем полей. Когда мы использовали в качестве ввода /etc/passwd, FS была установлена в «:». Это оказалось достаточно, но FS предоставляет нам еще большую гибкость.

Илон Маск рекомендует:  Справочник CSS в формате CHM

Значение переменной FS не обязано быть одним символом; ей может быть присвоено регулярное выражение, задающее символьный шаблон любой длины. Если производится обработка полей, разделенных одним или несколькими символами табуляции, то FS нужно настроить таким образом:

Выше мы использовали специальный символ регулярных выражений «+», который означает «одно или несколько вхождений предыдущего символа».

Если поля разделены пустой областью (один или несколько пробелов или символов табуляции), возможно, вам захочется установить для FS следующее регулярное выражение:

Хотя такая настройка сработает, в ней нет необходимости. Почему? Потому что по умолчанию значение FS равно одному символу пробела, который awk интерпретирует как «один или несколько пробелов или символов табуляции». В нашем конкретном примере значение FS по умолчанию именно такое, как нам было нужно!

Со сложными регулярными выражениями также не возникает проблем. Даже если записи разделены словом «foo», за которым следуют три цифры, следующее регулярное выражение позволит правильно разобрать данные:


Число полей

Следующие две переменные, которые мы собираемся рассмотреть, обычно не предназначены для записи в них, а используются для чтения и получения полезной информации о вводе. Первая из них — переменная NF, называемая также «число полей». Awk автоматически устанавливает значение этой переменной равным числу полей в текущей записи. Можно использовать переменную NF для отображения только определенных входных строк:

Конечно, переменную NF можно использовать и в условных операторах, например:

Номер записи

Еще одна удобная переменная — номер записи (NR). Она всегда содержит номер текущей записи (awk считает первую запись записью номер 1). До сих пор мы имели дело с входными файлами, которые содержали одну запись на строку. В таких ситуациях NR также сообщит номер текущей строки. Однако когда мы начнем обрабатывать многострочные записи в следующих статьях этой серии, это уже будет не так, поэтому нужно проявлять осторожность! NR можно использовать подобно переменной NF для вывода только определенных строк ввода:

Еще один пример:

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

Ресурсы для скачивания

Похожие темы

  • Оригинал статьи Common threads: Awk by example, Part 1. (EN)
  • Если вы предпочитаете добротные старомодные книги, то отличным выбором будет sed & awk, 2nd Edition издательства O’Reilly.(EN)
  • comp.lang.awk FAQ: много дополнительных ссылок по awk. (EN)
  • Учебник по awk Патрика Хартигана (Patrick Hartigan) содержит множество удобных скриптов на awk. (EN)
  • TAWK Compiler Томпсона компилирует скрипты на awk в быстрые исполняемые файлы. Имеются версии для Windows и DOS. (EN)
  • The GNU Awk User’s Gu >

Комментарии

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

Использование языка 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
# /etc/fstab: static file system information.
#
# Use ‘blkid’ to print the universally unique identifier for a
# device; this may be used with UU > # 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
UU >

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

awk ‘/UUID/’ /etc/fstab
# device; this may be used with UU > UU >

Как видите, теперь awk вывела только строки, содержащие последовательность «UUID». Можно также избавиться от посторонних строк, указав, что последовательность «UUID» должна быть расположена в самом начале строки:

awk ‘/^UUID/’ /etc/fstab
UU >

Аналогичным образом можно использовать часть «действие», чтобы указать, какую именно информацию нужно вывести. К примеру, чтобы вывести только первый столбец, наберите:

Также можно сослаться на каждый столбец (разделены пробелами) с помощью переменных, связанных с номером столбца. Так, на первый столбец можно сослаться, набрав $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, можно на специальных онлайн-ресурсах.

Язык обработки данных awk

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

AWK был создан в Bell Labs в 1977 году тремя авторами: Альфредом Ахо (Alfred Aho), Питером Вайнбергером (Peter Weinberger) и Брайаном Керниганом (Brian Kernighan). Эта версия языка вошла в Unix V7, выпущенный в 1979 году. В 1988 была выпущена книга “The AWK Programming Language”, в которой описывался новый диалект языка, вошедший в Unix SysV. Новый диалект был несовместим с исходным, и во избежание путанницы его называют nawk, или new awk, в то время как диалект 1977 года называют oawk, или old awk. nawk был выпущен под свободной лицензией в 1996 году и до сих пор поддерживается Керниганом.

В настоящее время AWK является одной из необходимых принадлежностей Unix-систем: вместе с Unix shell та или иная реализация AWK входит в стандартную поставку практически каждой Unix-подобной системы. Реализации AWK существуют для всех платформ.

Программа, написанная на AWK, принимает на вход поток текстовых данных (получаемых из файла или с консоли) и обрабатывает его построчно. Сама программа является набором правил вида “шаблон — действие”, где шаблон является регулярным выражением, а действие — последовательностью команд. Кроме того, программа может содержать определение пользовательских функций.

При обработке входного потока каждая строка данных сравнивается с каждым шаблоном, и выполняются действия тех правил, под шаблоны которых эта строка подходит. Шаблоны бывают следующих видов:

  • шаблон из одного выражения: действие выполняется для тех строк, для которых значение выражения истинно.
  • шаблон из пары выражений: действие выполняется для всех строк, начиная с той, для которой истинно первое выражение, и заканчивая той, для которой истинно второе.
  • в шаблонах чаще всего используются выражения, основанные на регулярных выражениях.
  • специальные шаблоны BEGIN и END задают действия, которые выполняются до и после обработки входного потока, соответственно.

AWK позволяет обрабатывать каждую строку как целую строку (переменная $0 ) или как последовательность “полей” — подстрок, разделенных пробелами (переменные $1, $2, . ). Кроме этих встроенных переменных, доступен ряд других — количество прочитанных строк в файле NR , количество полей в текущей записи NF и т.д. Системные переменные позволяют настраивать режим обработки данных, например, задавать разделители записей и полей записи (по умолчанию — перенос строки и пробел).

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

Среди недостатков языка называют:

  • необычную реализацию регулярных выражений — стандарт языка не позволяет извлечь из строки часть, соответствующую регулярному выражению ( gawk исправляет этот недочет).
  • невозможность повторно применить к строке один и тот же шаблон — это приходится программировать в явном виде. sed, послуживший одним из прообразов AWK, лишен этого недостатка.
  • отсутствие возможности интерпретировать содержимое обрабатываемых строк как часть программы.
  • необычный формат описания локальных переменных.

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


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

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

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

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

echo ‘one two three four’ | awk ‘

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

echo ‘one two three four’ | awk ‘

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

echo ‘one two three four’ | awk ‘
three one

echo ‘one two three four’ | awk ‘
foo: three | bar: one

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

echo ‘one mississippi:two mississippi:three mississippi:four mississippi’ | awk -F»:» ‘
four mississippi

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

echo ‘one mississippi:two mississippi:three mississippi:four mississippi’ | awk -F: ‘
four mississippi

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

echo ‘one two three four’ | awk ‘
four

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

echo ‘one two three four’ | awk ‘
three

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

echo ‘one two three four’ | awk ‘
three

echo ‘one two three four five’ | awk ‘
three

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

И еще одна возможность awk, поддержка обработчиков для строк:

echo -e ‘one 1\n two 2’ | awk ‘
one
two

echo -e ‘one 1\n two 2’ | awk ‘
1
2

echo -e ‘one 1\n two 2’ | awk ‘ END
3

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

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

23 июля 18:57:12 HTTPD [31950]: «GET / Foo / бар HTTP / 1.1» 200 344
23 июля 18:57:13 HTTPD [31950]: «GET / HTTP / 1.1» 200 9300
23 июля 19:01:27 HTTPD [31950]: «GET / HTTP / 1.1» 200 9300
23 июля 19:01:55 HTTPD [31950]: «GET / Foo / Baz HTTP / 1.1» 200 6401
23 июля 19:02:31 HTTPD [31950]: «? GET / Foo / Baz страница = 2 HTTP / 1.1» 200 6312

Нам известно что последнее поле это число переданных байт, тогда мы можем использовать переменную $NF:

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

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

Илон Маск рекомендует:  noscript в HTML

Язык обработки данных awk

), выполняется действие правила. $номер_поля !

шаблон если при просмотре указанной позиционной перменной не обнаруживается цепочка символов, тождественная образцу в шаблоне (оператор !

/^Иванов/ выделить запись, в которой третье поле начинается цепочкой символов «Иванов»; /([abc][ABC])$/ выделить запись, предпоследним символом которой явля- ется одна из букв abc и последним — одна из букв ABC; /[0-9]+/ выделить запись, содержащую не менее одной цифры; — 18 — $3 !

/(Сидор)|(Петр)/ не выделять запись, содержащую в третьем поле что-либо о Сидорах или Петрах; Ниже приведен пример AWK-программы, печатающей имена регистрационных каталогов и имена всех пользователей сис- темы, которыми не установлен пароль: BEGIN <FS = «:»; print(«Имя\tКаталог»); > $2 !

/(([09])|([az])|([AZ]))+/ <print( $1, «\t», $6); > В первом правиле (селектор BEGIN) меняется разделитель полей записи с пробела на двоеточие (такова структура записей в парольном файле /etc/passwd операционной системы ДЕМОС). Во втором поле записи парольного файла содержится зашифрованный пароль — обычно это комбинация цифр и букв. Если пароль не установлен, то второе поле записи пусто. Этот факт использо- ван для формирования селектора — второе поле не должно содержать цифр и букв. Селектор выделяет второе поле записи и проверяет наличие не менее одного символа в этом поле. Если поле пусто, выполняется действие, которое заключается в печати имени пользоватея (первое поле) и имени регистрацион- ного каталога пользователя (шестое поле). Иногда необходимо определить диапазон записей, для которых выполняется действие. Например, необходимо вывести на печать записи с номерами от 10 до 20 включительно. Или, допустим, вывести на печать поле номер 6 каждой записи, начиная с той, в которой второе поле «Петр», до той, в кото- рой пятое поле «Сидор». Для определения диапазона записей в селекторах используется операция запятая. До запятой указы- вается селектор, выделяющий первую запись в диапазоне, после запятой — селектор, выделяющий последнюю запись в диапазоне. Таким образом, мы имеем дело с составным селектором. Для всех записей диапазона выполняется действие правила с сос- тавным селектором. Рассмотрим пример. Допустим, имеется следующий файл: — 19 — sss поле2 поле3 поле4 1 поле1 sss поле3 поле4 2 поле1 поле2 sss поле4 3 поле1 поле2 поле3 sss 4 ttt поле2 поле3 поле4 5 поле1 ttt поле3 поле4 6 поле1 поле2 ttt поле4 7 поле1 поле2 поле3 ttt 8 Допустим, необходимо вывести на печать диапазон записей. Открывает этот диапазон запись, второе поле которой «sss», и закрывает запись, третье поле которой «ttt». Тогда программа выглядит следующим образом: $2

/ttt/ <print( $0 ); > В результате выполнения получим: поле1 sss поле3 поле4 2 поле1 поле2 sss поле4 3 поле1 поле2 поле3 sss 4 ttt поле2 поле3 поле4 5 поле1 ttt поле3 поле4 6 поле1 поле2 ttt поле4 7 В одной программе можно указать несколько правил с сос- тавными селекторами. При этом если выделенные диапазоны перекрываются, то каждая выделенная запись будет обрабаты- ваться несколькими правилами. Например, для того же исход- ного файла используется следующая программа обработки: $2

Язык обработки шаблонов awk

Awk — скриптовый язык построчного разбора и обработки входного потока (например, текстового файла) по заданным шаблонам (регулярным выражениям). Часто используется в сценариях командной строки. С помощью языка awk можно выполнять следующие действия:

  • Объявлять переменные для хранения данных.
  • Использовать арифметические и строковые операторы для работы с данными.
  • Использовать управляющие операторы и циклы, что позволяет реализовать сложные алгоритмы.
  • Создавать форматированные отчёты.

Вызов awk выглядит так:

Awk рассматривает входной поток как набор записей. Каждая запись делится на поля. По умолчанию разделителем записей является символ новой строки (то есть записи — это строки), разделителем полей — символ пробела или табуляции. Символы-разделители можно явно определить в программе.


  • -F fs — позволяет указать символ-разделитель для полей в записи.
  • -f file — указывает имя файла, из которого нужно прочесть awk-скрипт.
  • -v var=value — позволяет объявить переменную и задать её значение по умолчанию.
  • -mf N — задаёт максимальное число полей для обработки в файле данных.
  • -mr N — задаёт максимальный размер записи в файле данных.

Чтение awk-скриптов из командной строки

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

При вызове не указан файл с данными, поэтому awk ожидает поступления данных из STDIN . Чтобы завершить работу awk, нужно передать ему символ конца файла, воспользовавшись сочетанием клавиш CTRL+D .

Позиционные переменные, хранящие данные полей

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

  • $0 — представляет всю строку текста (запись)
  • $1 — первое поле в записи (строке)
  • $2 — второе поле в записи (строке)
  • и так далее

К переменной $n можно обратиться не только с помощью номера 0, 1, 2. Но и использовать переменную или выражение:

Поля выделяются из текста с использованием символа-разделителя. По умолчанию — это пробел или символ табуляции.

Если в качестве разделителя полей используется что-то, отличающееся от пробела или табуляции:

Использование нескольких команд

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

Первая команда записывает новое значение в переменную $4 , а вторая выводит на экран всю строку.

Чтение скрипта awk из файла

Awk позволяет хранить скрипты в файлах и ссылаться на них, используя ключ -f . Подготовим файл user-home.awk , в который запишем следующее:

Вызовем awk, указав этот файл в качестве источника команд:

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

Выполнение команд до начала обработки данных

Иногда нужно выполнить какие-то действия до того, как скрипт начнёт обработку записей из входного потока. Для этого можно воспользоваться ключевым словом BEGIN . Команды, которые следуют за BEGIN , будут исполнены до начала обработки данных.

Выполнение команд после окончания обработки данных

Ключевое слово END позволяет задавать команды, которые надо выполнить после окончания обработки данных:

Напишем скрипт следующего содержания и сохраним его в файле begin-end.awk :

Тут, в блоке BEGIN , создаётся заголовок табличного отчёта. В этом же разделе мы указываем символ-разделитель. После окончания обработки файла, благодаря блоку END , создается подвал отчета. Запустим скрипт:

Основные встроенные переменные

Кроме позиционных переменных $1 , $2 , $3 , которые позволяют извлекать значения полей, есть еще множество других. Вот некоторые из наиболее часто используемых:

  • FIELDWIDTHS — разделённый пробелами список чисел, определяющий точную ширину каждого поля данных с учётом разделителей полей.
  • FS — переменная, позволяющая задавать символ-разделитель полей.
  • RS — переменная, позволяющая задавать символ-разделитель записей.
  • OFS — разделитель полей на выводе awk-скрипта.
  • ORS — разделитель записей на выводе awk-скрипта.

По умолчанию переменная OFS настроена на использование пробела. Её можно установить так, как нужно для целей вывода данных:

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

При установленной переменной FIELDWIDTHS awk будет игнорировать переменную FS и находить поля данных в соответствии со сведениями об их ширине, заданными в FIELDWIDTHS .

Переменные RS и ORS задают порядок обработки записей. По умолчанию RS и ORS установлены на символ перевода строки. Это означает, что awk воспринимает каждую новую строку текста как новую запись и выводит каждую запись с новой строки.

Иногда случается так, что поля в потоке данных распределены по нескольким строкам:

Здесь в переменную FS мы записываем символ перевода строки. Это укажет awk на то, что каждая строка в потоке данных является отдельным полем. Кроме того, в переменную RS мы записываем пустую строку. Потому что в файле users.txt блоки данных о разных людях разделены пустой строкой. В результате awk будет считать пустые строки разделителями записей.

Дополнительные встроенные переменные

Помимо встроенных переменных, о которых мы уже говорили, существуют и другие:

  • ARGC — количество аргументов командной строки.
  • ARGV — массив с аргументами командной строки.
  • ARGIND — индекс текущего обрабатываемого файла в массиве ARGV .
  • ENVIRON — ассоциативный массив с переменными окружения и их значениями.
  • ERRNO — код системной ошибки, которая может возникнуть при чтении или закрытии входных файлов.
  • FILENAME — имя входного файла с данными.
  • IGNORECASE — если эта переменная установлена в ненулевое значение, при обработке игнорируется регистр символов.
  • FNR — номер текущей записи в файле данных.
  • NF — общее число полей данных в текущей записи.
  • NR — общее число обработанных записей.

Переменные ARGC и ARGV позволяют работать с аргументами командной строки. При этом скрипт, переданный awk, не попадает в массив аргументов ARGV :

Переменная ENVIRON представляет собой ассоциативный массив с переменными среды:

Переменные среды можно использовать и без обращения к ENVIRON :

Переменная NF позволяет обращаться к последнему полю данных в записи, не зная его точной позиции:

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


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

Пользовательские переменные

Как и любые другие языки программирования, awk позволяет программисту объявлять переменные. Имена переменных могут включать в себя буквы, цифры, символы подчёркивания. Однако, они не могут начинаться с цифры:

Каждая переменная или поле могут потенциально быть строкой или числом. Awk рассматривает переменную как строковую, пока не возникает необходимость выполнить операции сложения или конкатенации. Если к числу прибавляется строка, то строка автоматически преобразуется в число. Если к строке «прицепляется» число, то число преобразуется в строку.

Условный оператор if

Однострочный вариант оператора:

Если нужно выполнить в блоке if несколько операторов, их нужно заключить в фигурные скобки:

условный оператор if может содержать блок else :

Цикл while

Цикл while позволяет перебирать наборы данных, проверяя условие, которое остановит цикл.

В циклах while можно использовать команды break и continue . Первая позволяет досрочно завершить цикл и приступить к выполнению команд, расположенных после него. Вторая позволяет, не завершая до конца текущую итерацию, перейти к следующей.

Цикл for

Решим задачу расчёта среднего значения числовых полей с использованием цикла for :

Форматированный вывод данных

Команда printf позволяет выводить форматированные данные. Она даёт возможность настраивать внешний вид выводимых данных благодаря использованию шаблонов, в которых могут содержаться текстовые данные и спецификаторы форматирования.

Спецификатор форматирования — это специальный символ, который задаёт тип выводимых данных и то, как именно их нужно выводить. Awk использует спецификаторы форматирования как указатели мест вставки данных из переменных, передаваемых printf . Первый спецификатор соответствует первой переменной, второй спецификатор — второй, и так далее.

  • %c — воспринимает переданное ему число как код ASCII-символа и выводит этот символ.
  • %d — выводит десятичное целое число.
  • %i — то же самое, что и d .
  • %e — выводит число в экспоненциальной форме.
  • %f — выводит число с плавающей запятой.
  • %g — выводит число либо в экспоненциальной записи, либо в формате с плавающей запятой, в зависимости от того, как получается короче.
  • %o — выводит восьмеричное представление числа.
  • %s — выводит текстовую строку.

Встроенные функции

При работе с awk программисту доступны встроенные функции. В частности, это математические и строковые функции, функции для работы со временем.

Математические функции

  • cos(x) — косинус x (x выражено в радианах).
  • sin(x) — синус x (x выражено в радианах).
  • exp(x) — экспоненциальная функция.
  • int(x) — возвращает целую часть аргумента.
  • log(x) — натуральный логарифм.
  • rand() — возвращает случайное число с плавающей запятой в диапазоне от 0 до 1.
  • sqrt(x) — квадратный корень из x.

Строковые функции

  • length([arg]) — возвращает длину arg ; если arg не указан, то выдает длину текущей строки.
  • match(string,pattern) — возвращает позицию вхождения шаблона pattern в строку string ; или 0 , если совпадение не найдено.
  • index(string,needle) — возвращает начальную позицию вхождения подстроки needle в строку string ; если needle в string не содержится, возвращает 0 .
  • split(string,array[,sep]) — помещает поля строки string в массив array и возвращает число заполненных элементов массива; если указан sep , то при анализе строки он понимается как разделитель.
  • sub(replace,pattern[,string]) — заменяет в строке string первое вхождение шаблона pattern на строку replace ; в случае отсутствия аргумента string , применяется к текущей записи.
  • gsub(replace,pattern[,string]) — аналогична sub() , но заменяет все вхождения.
  • substr(string,start,length) — возвращает подстроку строки string , начиная с позиции start , длиной length символов.
  • tolower() — перевод в нижний регистр.
  • toupper() — перевод в верхний регистр.

Вот как пользоваться этими функциями:


Функция system

Функция system(«command») выполняет команду command и возвращает состояние выполненной команды.

Пользовательские функции

При необходимости можно создавать собственные функции awk. Для возвращения значения из функции можно использовать оператор return .

Шаблоны

В общем случае программа awk имеет вид:

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

В предпоследнем примере $3

/903/ означает, что третье поле содержит строку 903 . В последнем примере $3 !

/903/ все наоборот — третье поле не должно содержать строку 903 .

В шаблонах можно использовать регулярные выражения:

Шаблоны в awk это не просто строка или регулярное выражение. Они могут быть произвольными комбинациями относительных выражений (больше, меньше, равно, не равно, …) и регулярных выражений с использованием ! , || , && и круглых скобок:

/шаблон/

  • переменная in массив
  • (переменная, переменная, …) in массив
  • (переменная

    /шаблон/) || (выражение in массив)

  • (переменная >= 100) && (переменная
  • В случае использования относительных выражений , , == , != , >= , > происходит сравнение чисел, если оба операнда — числа. В противном случае сравниваются строки.

    Язык обработки данных awk

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

    Аргументы
    В приведенном выше примере синтаксиса программа — это программа на gawk, включаемая в командную строку.
    Файл_программы — это имя файла, в котором содержится программа на gawk.
    Включение программы в командную строку дает возможность писать короткие gawk-программы, не создавая отдельного файл_программы.
    Чтобы оболочка не интерпретировала команды gawk как команды оболочки, программу
    нужно поместить в одинарные кавычки.
    Если поместить длинную или сложную программу в файл, это позволит сократить количество возможных ошибок и исключить повторный набор программы.
    Список_файлов содержит путевые имена обычных файлов, обрабатываемых с помощью gawk.
    Эти файлы являются файлами ввода. Если список_файлов не указан, gawk получает ввод из стандартного ввода или из источника,указанного в инструкции getline

    Ключи
    С ключами, перед которыми ставится двойной дефис (—), работает только утилита
    gawk. При работе с awk или mawk эти ключи недоступны.

    Использование fs в качестве значения разделителя полей (field separator) ввода

    Чтение gawk-программы из файла по имени файл_программы, а не из командной
    строки. Этот ключ можно указать в командной строке более одного раза.

    Краткая справка по использованию gawk (только в gawk).

    Предупреждение о потенциально ошибочных или непереносимых конструктивных элементах gawk (только в gawk).

    Запуск POSIX-совместимой версии gawk. Этот ключ накладывает ряд ограничений, подробности которых даны в man-странице, посвященной gawk (тольков gawk).

    Игнорирование в gawk-программе новых функций GNU, позволяющее получить
    программу, совместимую с UNIX awk (только в gawk).

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

    Основы языка
    Программа на gawk (программа, набранная в командной строке или в файле_программы) состоит из одной и более строк, в которых содержится шаблон и (или) действие в следующем формате:

    Шаблон выбирает строки из ввода. Утилита gawk выполняет действие над всеми строками, выбранными шаблоном.
    Фигурные скобки, в которые заключено действие, позволяют gawk отличить его от шаблона. Если программная строка не содержит шаблона, gawk выбирает из ввода все строки.
    Если программная строка не содержит действия, gawk копирует выбранные строки на стандартный вывод.
    Сначала gawk сравнивает первую строку ввода (из файла, принадлежащего списку_файлов или из стандартного ввода) с каждым шаблоном программы.
    Если шаблон выбирает строку (если определяется ее соответствие шаблону), gawk выполняет действие, связанное с этим шаблоном. Если строка не выбрана, gawk не выполняет действие.
    Когда gawk завершит сравнение первой строки ввода, он повторяет процесс для следующей строки ввода. Он продолжает этот процесс сравнения последовательных
    строк ввода, пока не прочитает весь ввод.
    Если несколько шаблонов выбирают одну и ту же строку, gawk выполняет действие, связанное с каждым шаблоном, в порядке его появления в программе.
    Утилита gawk может отправить на стандартный вывод одну и ту же строку ввода более одного раза.

    Илон Маск рекомендует:  Iis настройка приложений asp

    Шаблоны

    В качестве шаблона можно использовать регулярное выражение, заключенное в слэши. Оператор

    проверяет, соответствует ли поле или переменная регулярному выражению.
    Оператор !

    проводит проверку на несоответствие. Используя операторы отношений,
    перечисленные в табл ниже, можно проводить как числовое, так и строковое сравнение.
    Булевые операторы || (ИЛИ) и && (И) позволяют объединять любые шаблоны.

    Два уникальных шаблона, BEGIN и END, выполняют команды перед тем,
    как утилита gawk приступит к обработке ввода, и после того, как она завершит эту обработку. До начала обработки всего ввода утилита gawk выполняет действия, связанные
    с шаблоном BEGIN, а по окончании обработки — действия, связанные с шаблоном END

    Запятая является оператором диапазона. Если два шаблона на одной
    строке gawk‑программы разделены запятой, gawk выбирает диапазон строк, начиная
    с первой строки, соответствующей первому шаблону. Последней строкой, выбранной
    gawk, будет следующая строка из последовательности строк, соответствующая второму шаблону. Если второму шаблону не будет соответствовать ни одна строка, gawk
    выберет каждую строку до конца ввода. После того как утилита gawk обнаружит соответствие второму шаблону, она возобновляет этот процесс, начиная новый поиск
    соответствия первому шаблону.

    Действия

    Действие является частью команды gawk, заставляющее gawk выполнить это действие при обнаружении соответствия шаблону.
    Если действие не указано, gawk выполняет действие по умолчанию.
    В этом качестве используется команда print (которая в явном виде предоставляется как ). Это действие копирует запись (как правило, строку) из ввода в стандартный вывод.

    Когда за командой print указываются аргументы, gawk выводит только их значения.
    Аргументами могут быть переменные или строковые константы. Вывод команды print
    можно отправить в файл (используя в gawk-программе символ >), добавить его к файлу (>>) или отправить через канал на ввод другой программы (|). Сопроцесс (|&) является двунаправленным каналом, осуществляющим обмен данными с программой, запущенной в фоновом режиме (доступен только в gawk)

    Пока объекты в команде print не будут разделены запятыми, gawk проводит их объединение.
    Запятые заставляют gawk разделить объекты, используя разделитель полей в выводе (OFS; как правило, в качестве разделителя используется пробел)
    В одну строку могут быть включены несколько действий, разделенные точками с запятой.

    Комментарии
    Утилита gawk игнорирует ту часть программной строки, которая следует за знаком решетки (#).
    Предваряя комментарии этим символом, можно осуществлять документирование gawk-программы.


    Переменные
    Хотя объявлять переменные в gawk до их применения не требуется, при желании им
    можно присваивать начальные значения. Беззнаковые числовые переменные инициализируются значением 0; строковые переменные инициализируются пустой строкой.
    Кроме поддержки пользовательских переменных, gawk поддерживает программные переменные.
    Оба этих вида переменных (пользовательские и программные) можно использовать в тех частях gawk-программы, которые относятся к шаблонам и действиям.
    Некоторые программные переменные перечислены в таблице ниже

    Кроме инициализации переменных внутри программы для их инициализации
    в командной строке можно воспользоваться ключом ––assign (–v).
    Эта возможность пригодится в том случае, если значение переменной от запуска к запуску gawk изменяется.

    Разделители Записей
    По умолчанию записи во вводе и в выводе отделяются друг от друга разделителем строк.
    То есть gawk принимает каждую строку ввода за отдельную запись и добавляет к концу каждой записи в выводе разделитель строк.
    По умолчанию разделителями полей во вводе являются символы пробелов и табуляции, а в качестве разделителя полей в выводе используется пробел.
    Значение любого разделителя можно в любое время заменить новым значением, присвоив это значение переменной либо из программы,
    либо из командной строки с помощью ключа ––assign (–v).

    Функции
    В таблице ниже перечислены некоторые функции, предоставляемые gawk для работы с числами и строками.

    Арифметические операторы
    Арифметические операторы gawk, перечисленные в таблице ниже позаимствованы из языка C.

    Ассоциативные массивы
    Ассоциативный массив — одно из самых мощных средств gawk. В качестве индексов в этих массивах используются строки
    Использование в качестве индексов числовых строк позволяет имитировать обычный массив.
    Для присваивания значения элементу ассоциативного массива используется следующий синтаксис:

    Регулярные выражения интерпретатора awk

    Простейшим регулярным выражением является строка символов, обрамленная знаками «/». Например:

    Эта означает все записи, которые содержат подстроку Asia (например, запись, содержащая Asia как часть длинной строки, подобной Asian или Pan-Asiatic).

    Чтобы ограничить поиск следует использовать операторы

    ищет подстроку Asia, в то время как программа:

    ищет подстроку в которой не содержится Asia.

    В регулярном выражении могут использоваться метасимволы:

    Символ Описание
    ^ указывает на начало строки (

    /^awk/ означает «начинается на awk»)

    $ указывает на конец строки (

    /awk$/ означает «заканчивается на awk»)

    . указывает на любой символ, кроме начала новой строки (

    /.wk/ может соответствовать «awk» но не «wk»)

    [] соответствует любому из указаных в квадратных скобках символу. Если первый символ внутри скобок ^ то берутся символы НЕ указанные в квадратных скобках. Вместо перечисления символов может быть указан диапазон (например «a-c»).
    * Любая подстрока или её отсутствие
    ? Любой символ или его отсутствие
    | разделяет альтернативы
    () групирует символы (

    /(awk|Shell)/ означает либо «awk», либо «Shell»)

    + означает что предыдущий символ или группа может повториться несколько раз (

    /(awk)+/ означает либо «awk», либо «awkawk», либо «awkawkawk» и т. д.)

    \ отменяет специальное значение символа, превращая его из метасимвола в обычный (

    /\^awk/ означает именно подстроку «^awk»)

    просматривает записи для поиска записи, состоящей из одного символа.

    поиск любой английской буквы

    Состоит только из цифр

    В дополнение к распознаваемым метасимволам, awk распознает следующие последовательности языка программирования Си внутри регулярных выражений и строк:

    \f – перевод формата

    \n – новая строка

    \r – возврат каретки

    \ddd – восьмиричное значение

    c – любой метасимвол

    Означает поиск табуляции

    Предположим, что нужно найти строку символов, подобную ^[0-9]+$. Если строка «^[0-9]+$» используется как регулярное выражение, появляются дополнительные знаки «\», которые защищают регулярное выражение. Это связано с тем, что первый уровень знаков «\» удаляется при синтаксическом анализе строки. Первый уровень «\» перед символом возвращает его специальное значение в регулярном выражении, второй нужен, чтобы защитить его в строке.

    Например, нужно найти строки, содержащие «b» и следующий за ним знак «$». Регулярное выражение для этого шаблона:

    Чтобы создать строку для представления этого регулярного выражения, необходимо добавить еще один символ «\»:

    Следующие регулярные выражения попарно эквивалентны:

    /b\$/ x

    /b$/ x

    /b$/ x

    Регулярные выражения Perl (целиком совместимы с выражениями в .htaccess)

    Символ Описание
    . Соответствует любому символу (за исключением символа новой строки)
    (. ) Группирует последовательность элементов
    + Удовлетворяет предыдущему образцу один или большее количество раз
    ? Удовлетворяет образцу нуль или один раз
    * Соответствует образцу один или нуль раз
    [. ] Соответствует символу из заданного множества
    [^. ] Соответствует символу из множества, полученного отрицанием
    (. |. |. ) Соответствует одной из альтернатив
    ^ Соответствует началу строки
    $ Соответствует образцу в конце строки
    Соответствует образцу от n до m раз
    Соответствует образцу точно n раз
    Соответствует образцу минимум n раз
    \n\t etc. Соответствует знаку новой линии, символу табуляции и т. д.
    \b Соответствует на границе слова
    Соответствует НЕ границе слова
    \d Соответствует цифре
    \D Соответствует не цифре
    \s Соответствует пробелу
    \S Соответствует не пробелу
    \w Соответствует букве или цифре
    \W Соответствует символу, не являющемуся ни буквой, ни цифрой

    Perl помещает регулярные выражения (образцы, шаблоны) в слэши, т. е. в наклонные черточки, например, в виде /pattern/. Следующие регулярные выражения истинны если:

    /ig/ Строка содержит ‘ig’
    /(b|d|f)ig/ Строка содержит ‘big’, ‘dig’ or ‘fig’
    /[0-9]+/ Строка содержит номер

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

    В данном случае регулярные выражения принимают значение «истинно», если образец найден в строке ($str). Если строка по содержит образца, то выражение возвращает значение «ложно». Например, следующее выражение проверяет, содержит ли строка текст Web Programming:

    Для того, чтобы проверить полное совпадение, выражение должно привязать сравнение к началу и концу строки. Например, следующее выражение имеет значением величину «истинно», если и только если переменная $str принимает одно из трех значений: «banana», «bananana») «banananana»:

    Аналогичным образом, следующее выражение истинно тогда и только тогда, когда переменная $str содержит слово «the» и не является частью другого слова, такого как «their».


    Не нашли то, что искали? Воспользуйтесь поиском:

    Лучшие изречения: Да какие ж вы математики, если запаролиться нормально не можете. 8427 — | 7331 — или читать все.

    188.64.174.135 © studopedia.ru Не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования. Есть нарушение авторского права? Напишите нам | Обратная связь.

    Отключите adBlock!
    и обновите страницу (F5)

    очень нужно

    Язык обработки данных awk

    awk — ЪЮЬРЭФР ЪЮЭвХЪбвЭЮУЮ ЯЮШбЪР Ш ЯаХЮСаРЧЮТРЭШп вХЪбвР.
    ѕЭР — дШЫмва. µХ ЬЮЦЭЮ аРббЬРваШТРвм ЪРЪ ЮСЮЫЮзЪг «awk» Т
    ЮСЮЫЮзЪХ «shell».

    1. БВАГєВГА° awk-їАѕіА°јјЛ

    їаЮУаРЬЬР бЮбвЮШв ШЧ ЮЯХаРвЮаЮТ (ЯаРТШЫ), ШЬХойШе ТШФ:

    <ФХЩбвТШХ>— ЪЮУФР ФХЩбвТШХ ТлЯЮЫЭпХвбп ФЫп ТбХе бваЮЪ.
    иРСЫЮЭ — ЪЮУФР ТлТЮФпвбп бваЮЪШ б ФРЭЭлЬ иРСЫЮЭЮЬ.

    ґХЩбвТШХ ЬЮЦХв бЮбвЮпвм ШЧ ЯЮбЫХФЮТРвХЫмЭЮбвШ ЮЯХаРвЮаЮТ,
    аРЧФХЫпХЬЮЩ «;» ШЫШ ЯХаХТЮФЮЬ бваЮЪШ ШЫШ ЧРЪалТРойХЩ бЪЮСЪЮЩ.

    ІЮЧЬЮЦЭл ЪЮЬЬХЭвРаШШ (ЪРЪ Т shell «#. «).

    їаШЬХа:
    ґЫп ФРЫмЭХЩиШе ЯаШЬХаЮТ ТЮЧмЬХЬ ТеЮФЭЮЩ дРЩЫ «f-awk»
    ( дРЬШЫШп ШЭШжШРЫл УЮФ-ЯаШХЬР-ЭР-аРСЮвг ТЮЧаРбв ):

    ёТРЭЮТ ё.ё. 1980 50
    їХваЮТ °.І. 1979 40
    БШФЮаЮТ Б.є. 1979 40
    ЕТХФЮаЮТ ё.Е. 1970 60

    awk ‘‘ f-awk # ТлФРХв ТХбм вХЪбв;
    echo
    awk ‘/ФЮ/ ‘ f-awk # ТлФРХв бваЮЪШ, УФХ Хбвм «ФЮ».
    echo
    awk ‘/ФЮ/ <>‘ f-awk # ТлФРХв бваЮЪШ, УФХ Хбвм «ФЮ»
    echo
    awk ‘/ФЮ/ ‘ f-awk

    АХЧгЫмвРв:
    ёТРЭЮТ ё.ё. 1980 50
    їХваЮТ °.І. 1979 40
    БШФЮаЮТ Б.є. 1979 40
    ЕТХФЮаЮТ ё.Е. 1970 60

    БШФЮаЮТ Б.є. 1979 40
    ЕТХФЮаЮТ ё.Е. 1970 60

    БШФЮаЮТ Б.є. 1979 40
    ЕТХФЮаЮТ ё.Е. 1970 60

    БгйХбвТгХв ФТР ЮЯХаРвЮаР бЯХжШРЫмЭЮУЮ ТШФР («BEGIN»-
    ЭРзРЫмЭлХ гбвРЭЮТЪШ Ш «END» — «ЯЮбЫХФХЩбвТШп»):

    ІЮЧЬЮЦЭл ФТР ЮбЭЮТЭле ТРаШРЭвР:

    1) awk [-Fc] ‘prog.awk’ [files]

    НвЮ ЯаЮбвХЩиШЩ бЫгзРЩ, ЪЮУФР ЯаЮУаРЬЬР (ЧРЪЫозХЭЭРп Т
    ЪРТлзЪШ » ‘ «) ЭРеЮФШвбп Т вХЫХ ЪЮЬРЭФл,
    «-Fc» — дЫРУ, ЬХЭпойШЩ бвРЭФРавЭлЩ аРЧФХЫШвХЫм ЯЮЫХЩ ЭР «c»
    «file» — ШЬп дРЩЫР ШбеЮФЭле ФРЭЭле, ЯаШ ХУЮ ЮвбгвбвТШШ — бЮ
    бвРЭФРавЭЮУЮ ТеЮФР. (НвЮв дЮаЬРв ШбЯЮЫЧЮТРЭ Т ЭРзРЫмЭле ЯаШЬХаРе).

    cat f-awk | awk ‘/ФЮ/

    ѕЯХаРжШп «ЯаЮСХЫ» — ЪЮЭЪРвХЭРжШп.

    4. їАёјµАЛ awk-їАѕіА°јј

    АХЧгЫмвРв:
    ё.ё. 1980
    °.І. 1979
    Б.є. 1979
    ё.Е. 1970

    АХЧгЫмвРв:
    °.І. 1979
    ё.Е. 1970

    АХЧгЫмвРв:
    їХваЮТ 21
    ЕТХФЮаЮТ 30

    АХЧгЫмвРв:
    БгЬЬРаЭлЩ ТЮЧаРбв:190
    БаХФЭШЩ ТЮЧаРбв:47.5

    5) awk ‘< s += $4 > бваЮЪХ бХЫХЪвЮаР.
    І ЪРзХбвТХ бХЫХЪвЮаР ЬЮЦХв Слвм:
    1) ТлаРЦХЭШХ;
    2) иРСЫЮЭ;
    3) Ше ЪЮЬСШЭРжШп.

    БЮЮвТХвбТгойШХ ЯаШЬХал:
    1) $3 != $4 && $3 > 1970
    $3 % 2 == 1
    $1==»ёТРЭЮТ» — ЪРТлзЪШ, звЮСл ТЮбЯаШЭШЬРЫЮбм, ЪРЪ бваЮЪР.

    2) /ab/ ЮвЫШзЭЮ Юв /a b/, / ab/ Ш /ab /
    NЯЮЫп ^иРСЫЮЭ — ЯЮ бЮТЯРФХЭШо
    NЯЮЫп !^иРСЫЮЭ — ЯЮ ЭХбЮТЯРФХЭШо

    АХЧгЫмвРв:
    ёТРЭЮТ ё.ё. 1980 50
    їХваЮТ °.І. 1979 40
    БШФЮаЮТ Б.є. 1979 40

    АХЧгЫмвРв:
    ёТРЭЮТ ё.ё. 1980 50

    АХЧгЫмвРв:
    ёТРЭЮТ ё.ё. 1980 50
    БШФЮаЮТ Б.є. 1979 40
    ЕТХФЮаЮТ ё.Е. 1970 60

    6) awk ‘/1980/,/1979/ ‘ f-awk

    АХЧгЫмвРв:
    ёТРЭЮТ ё.ё. 1980 50
    їХваЮТ °.І. 1979 40

    І awk ТЮЧЬЮЦЭл бЫХФгойШХ ФХЩбвТШп:
    1) ЯаШбТРШТРЭШп ТлаРЦХЭШЩ;
    2) ЮЯХаРвЮал гЯаРТЫХЭШп
    3) ЮЯХаРвЮал ТлТЮФР;
    4) ТбваЮХЭЭлХ дгЭЪжШШ.

    exit — ЧРТХаиШвм ТлЯЮЫЭХЭШХ ЯаЮУаРЬЬл;
    next — ЯХаХЩвШ Ъ бЫХФгойХЩ бваЮЪХ,
    гЯаРТЫХЭШХ ЭР ЭРзРЫЮ awk-ЯаЮУаРЬЬл;
    break — ТлеЮФ ШЧ жШЪЫР;
    continue — ЯХаХеЮФ Ъ бЫХФгойХЩ ШвХаРжШШ;

    if (гбЫЮТШХ) <ЮЯХаРвЮал>[else <ЮЯХаРвЮал>]
    while (гбЫЮТШХ) <ЮЯХаРвЮал>
    for (ТлаРЦХЭШХ; гбЫЮТШХ; ТлаРЦХЭШХ) <ЮЯХаРвЮал>
    for (ШЭФХЪб in ШЬп_ЬРббШТР)

    БвагЪвгаЭлХ ЮЯХаРвЮал Т ЧЭРзШвХЫмЭЮЩ бвХЯХЭШ РЭРЫЮУШзЭл
    бЮЮвТХвбТгойШЬ ЮЯХаРвЮаРЬ БШ.
    І ЯЮбЫХФЭХЬ бЫгзРХ ФЫп ЪРЦФЮУЮ ШЭФХЪбР ТлЯЮЫЭпХвбп СЫЮЪ.
    ВХЪбвЮТлХ ШЭФХЪбл аРббЬРвШаТРовбп Т ЫХЪбШЪЮУаРдШзХбЪЮЬ ЯЮапФЪХ.

    АХЧгЫмвРв:
    50 1980 ё.ё. ёТРЭЮТ
    40 1979 °.І. їХваЮТ
    40 1979 Б.є. БШФЮаЮТ
    60 1970 ё.Е. ЕТХФЮаЮТ

    ·ФХбм, ЪаЮЬХ ШЧЬХЭХЭШп ЮзХаХФЭЮбвШ ЯЮЫХЩ Т бваЮЪХ ЭР
    ЯаЮвШТЮЯЮЫЮЦЭЮХ (звЮ ФХЫРХв жШЪЫ «for»), ЯаХФТРаШвХЫмЭЮ
    гбвРЭРТЫШТРХвбп ТлеЮФЭЮЩ аРЧФХЫШвХЫм — ЯаЮСХЫ Ш ТХбм аХЧгЫмвРв
    ЯаХФТРаШвХЫмЭЮ ТлФРХвбп Т ЮФЭг бваЮЪг, ЯЮнвЮЬг ЯЮбЫХ ЮСаРСЮвЪШ
    ЪРЦФЮЩ бваЮЪШ ТлФРХвбп ЪЮЬРЭФР «print RS» ФЫп ЯХаХТЮФР ТлеЮФЭЮЩ
    бваЮЪШ. АХФРЪвЮа «sed» ЯЮФЪЫозХЭ зХаХЧ ЪЮЭТХЩХа, звЮСл гСаРвм
    ТЮЧЬЮЦЭлХ ЯаЮСХЫл Т ЭРзРЫХ бваЮЪШ.
    БгйХбвТХЭЭРп ФХвРЫм. µбЫШ ЧРЯгбвШвм ЫШим СРЧЮТго бвагЪвгаг

    вЮ ТбХ ЯЮЫп ШбеЮФЭЮЩ вРСЫШжл б ШЧЬХЭХЭШпЬШ ЯЮапФЪР ТЭгваШ
    ЯаХЦЭШе бваЮЪ ЯЮЫгзШЬ ТлвпЭгвлЬШ Т ЮФШЭ бвЮЫСХж ЯХаХТЮФЮЬ бваЮЪШ:

    ѕФЭРЪЮ, ХбЫШ ЯЮбвРТШЬ «;» баРЧг ЯЮбЫХ гбЫЮТШп, в.Х. бФХЫРХЬ
    ЯгбвЮХ вХЫЮ жШЪЫР, ЧР ЯаХФХЫл ЪЮвЮаЮУЮ ТлЭХбХЭ «print $k»

    вЮ ЯЮЫгзШЬ ШбеЮФЭго вРСЫШжг

    ёТРЭЮТ ё.ё. 1980 50
    їХваЮТ °.І. 1979 40
    БШФЮаЮТ Б.є. 1979 40
    ЕТХФЮаЮТ ё.Е. 1970 60

    ЯЮбЪЮЫмЪг «$k» ЯЮбЫХ ТлеЮФР ШЧ жШЪЫР СгФХв ШЬХвм ЧЭРзХЭШХ
    «0», Р «$0» — бЮЮвТХвбТгХв ТбХЩ бваЮЪХ Т ЪРзХбвТХ ЧЭРзХЭШп(!), вЮ
    «print $k» СгФХв ЯЮбЫХ ЪРЦФЮУЮ жШЪЫР ЯХзРвРвм ЯЮЫЭлХ бваЮЪШ.

    8. ІІѕґ ё ІЛІѕґ ґ°ЅЅЛЕ

    І ЮСйХЬ бЫгзРХ Т ЪЮЬРЭФХ awk ЬЮЦХв Слвм гЪРЧРЭЮ ЭХбЪЮЫмЪЮ
    дРЩЫЮТ.
    ЅРЯЮЬЭШЬ дЮаЬРвл ТлЧЮТР ЪЮЬРЭФл:

    awk [-Fc] ‘prog.awk’ [file . ]
    awk [-Fc] -f prog.awk [file . ]
    ^
    ДРЩЫл ЮСаРСРвлТРовбп ЯЮбЫХФЮТРвХЫмЭЮ Т гЪРЧРЭЭЮЬ ЯЮапФЪХ.
    НвЮ ЬЮЦЭЮ ШбЯЮЫмЧЮТРвм ФЫп «ЭРбваЮЩЪШ» awk ЪЮЬРЭФл ЯаШ
    ЮСаРСЮвЪХ ЯЮбЫХФгойШе дРЩЫЮТ.

    їгбвм дРЩЫ «f0» ШЬХХв ТШФ:

    ° дРЩЫ awk-ЯаЮУаРЬЬл «prim.awk» ШЬХХв ТШФ:

    FILENAME == «f0» < # ХбЫШ ЯаЮбЬРваШТРХвбп дРЩЫ "f0"
    w1 = $2 # ЯаШбТРШТРовбп ЧЭРзХЭШп ЯХаХЬХЭЭлЬ
    w2 = $1 # w1 — БШФЮаЮТ, w2 — 60
    >
    $1 == w1 < print ("дРЬШЫШп: "$1)># ЮЧЭРзХЭЭлХ ЯХаХЬХЭЭлХ
    $4 == w2 < print ("УЮФл: " $4)># ШбЯЮЫмЧговбп Т
    # бХЫХЪвЮаРе

    ВЮУФР ЯаШ ТлЧЮТХ ЪЮЬРЭФл

    awk -f prim.awk f0 f-awk

    дРЬШЫШп: БШФЮаЮТ
    УЮФл: 60

    ВЮ Хбвм ТвЮаЮХ ЯЮЫХ дРЩЫР «f0» ФРХв ЧЭРзХЭШХ ЯХаХЬХЭЭЮЩ
    «w1», Р ЯХаТЮХ — «w2». НвШ ЯХаХЬХЭЭлХ ШбЯЮЫмЧговбп Т бХЫХЪвЮаРе
    ЯаШ ЮСаРСЮвЪХ дРЩЫР «f-awk».

    ёЧЬХЭШЬ ЯаЮУаРЬЬг Т дРЩЫХ «f-awk»:

    АХЧгЫмвРв:
    дРЬШЫШп: ёТРЭЮТ
    дРЬШЫШп: їХваЮТ
    дРЬШЫШп: БШФЮаЮТ
    дРЬШЫШп: ЕТХФЮаЮТ

    µбЫШ ШбЪЫозШвм ЯХаТлЩ ЮЯХаРвЮа «next», вЮ Т ТлеЮФЭЮЬ дРЩЫХ
    ЯЮпТШвбп ФЮЯЮЫЭШвХЫмЭЮ ЯХаТРп бваЮЪР:

    ЯЮбЪЮЫмЪг ТлСШаРХвбп бЭЮТР ЯХаТЮХ ЯЮЫХ Т ЯХТЮЬ дРЩЫХ («f0»).
    µбЫШ ШбЪЫозШвм Ш ТвЮаЮЩ «next», вЮ Т ТлеЮФЭЮЬ дРЩЫХ ЯЮпТШвбп
    ФЮЯЮЫЭШвХЫмЭЮ ЯЮбЫХФЭпп бваЮЪР:

    ЪЮвЮаРп аРЭХХ ЭХ ТлТЮФШЫРбм, вРЪ ЪРЪ Т ЯаХФиХбвТгойШЩ
    ЮЯХаРвЮа » < print ("дРЬШЫШп: "$1)>» ЧРЪРЭзШТРЫ аРСЮвг ЭР
    їѕБ»µґЅµ№ бваЮЪХ дРЩЫР «f-awk», ЯЮнвЮЬг «next» ЯаЮЯгбЪРЫ
    ЯЮбЫХФгойго ЪЮЬРЭФЭго бваЮЪг
    $4 == w2

    ё ХйХ ЮФЭР ЬЮФШдШЪРжШп Т бТпЧШ б ТТЮФЮЬ ФРЭЭле б вХаЬШЭРЫР.
    ІлЧЮТ ЪЮЬРЭФл СгФХв:

    awk -f prim.awk f0 f-awk

    ° дРЩЫ «prim.awk» ЯаШЬХв ТШФ:

    9. ІБВАѕµЅЅЛµ ДГЅєЖёё

    ІбваЮХЭЭлХ дгЭЪжШШ:
    sin (expr) бШЭгб expr
    cos (expr) ЪЮбШЭгб expr
    exp (expr) ТЮЧТХФХЭШХ Т бвХЯХЭм expr
    log (expr) ЭРвгаРЫмЭлЩ ЫЮУЮаШдЬ expr
    sqrt (expr) ШЧТЫХзХЭШХ ЪЮаЭп expr
    int (expr) жХЫРп зРбвм зШбЫР
    length (s) ФЫШЭР бваЮЪШ s
    printf (fmt, . ) дЮаЬРвШаЮТРЭШХ (РЭРЫЮУШзЭЮ БШ)
    ЯЮ бЯХжШдШЪРжШШ fmt.
    substr (s, m, n) ЯЮФбваЮЪР Т n бШЬТЮЫЮТ бваЮЪШ s,
    ЭРзШЭРойРпбп б m.
    getline () звХЭШХ бЫХФгойХЩ бваЮЪШ.
    0 — ЪЮЭХж дРЩЫР, ШЭРзХ 1.
    index (s1, s2) ЭЮЬХа ЯЮЧШжШШ,
    б ЪЮвЮаЮЩ s1 бЮТЯРФРХв б s2, ШЭРзХ 0.
    split (s, M, c) бваЮЪР s аРЧСШТРХвбп нЫХЬХЭвл ЬРббШТР M
    ЯЮ аРЧФХЫШвХЫо c (ЯЮ гЬЮЫзРЭШо FS=» «);
    дгЭЪжШп ТЮЧТаРйРХв зШбЫЮ ЯЮЫХЩ.

    АХЧгЫмвРв:
    9 БШФЮаЮТ Б.є. 1979 40
    10 ЕТХФЮаЮТ ё.Е. 1970 60
    ЅРЩФХЭЮ бваЮЪ: 2

    ·ФХбв ЯЮЫп аРЧФХЫповбп ЯЮ «.», ТлСШаРовбп бваЮЪШ г ЪЮвЮале
    ФЫШЭР ЯХаТЮУЮ ЯЮЫп СЮЫмиХ 8-ЬШ, Ш Ше ФЫШЭР «length ($1)»
    ЯХзРвРХвбп ЯХаХФ бваЮЪЮЩ «$0».

    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL