- Linux awk command
- Description
- Syntax
- Arguments
- Overview
- Команда AWK в Linux с примерами
- Как работает awk
- Записи и поля
- Программа awk
- Выполнение программ awk
- Шаблоны AWK
- Шаблоны регулярных выражений
- Шаблоны реляционных выражений
- Шаблоны диапазонов
- Специальные шаблоны выражения
- Комбинирование узоров
- Встроенные переменные
- Изменение поля и разделителя записей
- Действия при отсутствии нагрузки
- Использование переменных оболочки в программах AWK
- Выводы
Linux awk command
On Unix-like operating systems, the awk command runs AWK, a text-processing programming language.
This page covers the GNU/Linux version of AWK, gawk. On Linux systems, the awk command is generally a symbolic link to the executable file /usr/bin/gawk.
Description
Short for «Aho, Weinberger, and Kernighan,» AWK is an interpreted programming language which focuses on processing text.
AWK was developed in the 1970s at Bell Labs by Alfred Aho, Peter Weinberger, and Brian Kernighan. It was designed to execute complex pattern-matching operations on streams of textual data. It makes heavy use of strings, associative arrays, and regular expressions, and is immensely useful for parsing system data and generating automatic reports.
AWK is a direct predecessor of Perl, and is still very useful in modern systems. The GNU free software project distributes an open-source version of AWK called gawk.
Syntax
Arguments
-F fs | Sets the input field separator to the regular expression fs. |
-v var=value | Assigns the value value to the variable var before executing the awk program. |
‘prog’ | An awk program. |
-f progfile | Specify a file, progfile, which contains the awk program to be executed. |
file . | A file to be processed by the specified awk program. |
Overview
Awk scans each input file for lines that match any of a set of patterns specified literally in prog or in one or more files specified as -f progfile. With each pattern, there is an associated action that will be performed when a line of a file matches the pattern. Each line is matched against the pattern portion of every pattern-action statement; the associated action is performed for each matched pattern. The file name «—» (a dash) instructs awk to read from the standard input. The option -v followed by var=value is an assignment to be done before prog is executed; any number of -v options may be present. The -F fs option defines the input field separator to be the regular expression fs.
An input line is normally made up of fields separated by white space, or by regular expression fs. The fields are denoted $1, $2, . , while $0 refers to the entire line. If fs is null, the input line is split into one field per character.
A pattern-action statement has the form
A missing <action > means print the line; if no pattern is specified, it always matches. Pattern-action statements are separated by newlines or semicolons.
An action is a sequence of statements. A statement can be one of the following:
(skips remaining patterns on this input line)
(skips rest of this file, open next, start at top)
(deletes an array element)
(deletes all elements of array)
(exits immediately; exit status is the evaluation of expression)
Statements are terminated by semicolons, newlines or right braces. An empty expression-list stands for $0. String constants are quoted » «, with the usual C escapes recognized within. Expressions take on string or numeric values as appropriate, and are built using the operators +, —, *, /, %, ^ (exponentiation), and concatenation (indicated by white space).
operators !, ++, —, +=, -=, *=, /=, %=, ^=, >, >=, file or >>file is present or on a pipe if |cmd is present), separated by the current output field separator, and terminated by the output record separator. file and cmd may be literal names or parenthesized expressions; identical string values in different statements denote the same open file. The printf statement formats its expression list according to the format (see printf). The built-in function close(expr) closes the file or pipe expr. The built-in function fflush(expr) flushes any buffered output for the file or pipe expr.
The mathematical functions exp, log, sqrt, sin, cos, and atan2 are built-in. Other built-in functions:
length | The length of its argument taken as a string, or of $0 if no argument. |
rand | Random number between 0 and 1 |
srand | Sets seed for rand and returns the previous seed. |
int | Truncates to an integer value |
substr(s, m, n) | The n-character substring of s that begins at position m counted from 1. |
index(s, t) | The position in s where the string t occurs, or 0 if it does not. |
match(s, r) | The position in s where the regular expression r occurs, or 0 if it does not. The variables RSTART and RLENGTH are set to the position and length of the matched string. |
split(s, a, fs) | Splits the string s into array elements a[1], a[2], . a[n], and returns n. The separation is done with the regular expression fs or with the field separator FS if fs is not given. An empty string as field separator splits the string into one array element per character. |
sub(r, t, s) | Substitutes t for the first occurrence of the regular expression r in the string s. If s is not given, $0 is used. |
gsub | Same as sub except that all occurrences of the regular expression are replaced; sub and gsub return the number of replacements. |
sprintf(fmt, expr, . ) | The string resulting from formatting expr . according to the printf format fmt |
system(cmd) | Executes cmd and returns its exit status |
tolower(str) | Returns a copy of str with all uppercase characters translated to their corresponding lowercase equivalents. |
toupper(str) | Returns a copy of str with all lowercase characters translated to their corresponding uppercase equivalents. |
The function getline sets $0 to the next input record from the current input file; getline
Источник
Команда AWK в Linux с примерами
Awk — это язык сценариев общего назначения, предназначенный для расширенной обработки текста. В основном он используется как инструмент отчетности и анализа.
В отличие от большинства других процедурных языков программирования, awk управляется данными, что означает, что вы определяете набор действий, выполняемых с вводимым текстом. Он принимает входные данные, преобразует их и отправляет результат на стандартный вывод.
В этой статье рассматриваются основы языка программирования awk. Знание основ awk значительно улучшит вашу способность манипулировать текстовыми файлами в командной строке.
Как работает awk
Существует несколько различных реализаций awk. Мы будем использовать GNU-реализацию awk, которая называется gawk. В большинстве систем Linux интерпретатор awk — это просто символическая ссылка на gawk .
Записи и поля
Awk может обрабатывать текстовые файлы данных и потоки. Входные данные разделены на записи и поля. Awk работает с одной записью за раз, пока не будет достигнут конец ввода. Записи разделяются символом, который называется разделителем записей. Разделителем записей по умолчанию является символ новой строки, что означает, что каждая строка в текстовых данных является записью. Новый разделитель записей может быть установлен с помощью переменной RS .
Записи состоят из полей, разделенных разделителем полей. По умолчанию поля разделяются пробелом, включая один или несколько символов табуляции, пробела и новой строки.
Поля в каждой записи обозначаются знаком доллара ( $ ), за которым следует номер поля, начинающийся с 1. Первое поле представлено с помощью $1 , второе — с помощью $2 и так далее. На последнее поле также можно ссылаться с помощью специальной переменной $NF . На всю запись можно ссылаться с помощью $0 .
Вот визуальное представление, показывающее, как ссылаться на записи и поля:
Программа awk
Чтобы обработать текст с помощью awk , вы пишете программу, которая сообщает команде, что делать. Программа состоит из ряда правил и пользовательских функций. Каждое правило содержит одну пару шаблон и действие. Правила разделяются новой строкой или точкой с запятой ( ; ). Обычно awk-программа выглядит так:
Когда awk обрабатывает данные, если шаблон соответствует записи, он выполняет указанное действие с этой записью. Если у правила нет шаблона, все записи (строки) совпадают.
Действие awk заключено в фигурные скобки ( <> ) и состоит из операторов. Каждый оператор определяет операцию, которую нужно выполнить. В действии может быть несколько операторов, разделенных новой строкой или точкой с запятой ( ; ). Если правило не имеет действия, по умолчанию выполняется печать всей записи.
Awk поддерживает различные типы операторов, включая выражения, условные операторы, операторы ввода, вывода и т. Д. Наиболее распространенные операторы awk:
- exit — останавливает выполнение всей программы и выходит.
- next — останавливает обработку текущей записи и переходит к следующей записи во входных данных.
- print — Печать записей, полей, переменных и настраиваемого текста.
- printf — дает вам больше контроля над форматом вывода, аналогично C и bash printf .
При написании программ awk все, что находится после решетки (#) и до конца строки, считается комментарием. Длинные строки можно разбить на несколько строк с помощью символа продолжения, обратной косой черты ( ).
Выполнение программ awk
Программа awk может быть запущена несколькими способами. Если программа короткая и простая, ее можно передать непосредственно интерпретатору awk из командной строки:
При запуске программы в командной строке ее следует заключать в одинарные кавычки ( » ), чтобы оболочка не интерпретировала программу.
Если программа большая и сложная, лучше всего поместить ее в файл и использовать параметр -f для передачи файла команде awk :
В приведенных ниже примерах мы будем использовать файл с именем «team.txt», который выглядит примерно так:
Шаблоны AWK
Шаблоны в awk определяют, следует ли выполнять соответствующее действие.
Awk поддерживает различные типы шаблонов, включая регулярное выражение, выражение отношения, диапазон и шаблоны специальных выражений.
Если у правила нет шаблона, сопоставляется каждая входная запись. Вот пример правила, содержащего только действие:
Программа распечатает третье поле каждой записи:
Шаблоны регулярных выражений
Регулярное выражение или регулярное выражение — это шаблон, который соответствует набору строк. Шаблоны регулярных выражений AWK заключаются в косую черту ( // ):
Самый простой пример — это буквальное сопоставление символа или строки. Например, чтобы отобразить первое поле каждой записи, содержащее «0,5», вы должны выполнить следующую команду:
Шаблон может быть любым типом расширенного регулярного выражения. Вот пример, который печатает первое поле, если запись начинается с двух или более цифр:
Шаблоны реляционных выражений
Шаблоны реляционных выражений обычно используются для сопоставления содержимого определенного поля или переменной.
По умолчанию шаблоны регулярных выражений сопоставляются с записями. Чтобы сопоставить регулярное выражение с полем, укажите поле и используйте оператор сравнения «содержать» (
Например, чтобы напечатать первое поле каждой записи, второе поле которой содержит «ia», вы должны ввести:
Чтобы сопоставить поля, которые не содержат заданного шаблона, используйте оператор !
Вы можете сравнивать строки или числа для таких отношений, как, больше, меньше, равно и т. Д. Следующая команда печатает первое поле всех записей, третье поле которых больше 50:
Шаблоны диапазонов
Шаблоны диапазонов состоят из двух шаблонов, разделенных запятой:
Все записи, начинающиеся с записи, соответствующей первому шаблону, до совпадения с записью, соответствующей второму шаблону.
Вот пример, который напечатает первое поле всех записей, начиная с записи, включая «Raptors», до записи, включающей «Celtics»:
Шаблоны также могут быть выражениями отношений. Приведенная ниже команда распечатает все записи, начиная с той, четвертое поле которой равно 32, до той, четвертое поле которой равно 33:
Шаблоны диапазона нельзя комбинировать с другими выражениями шаблона.
Специальные шаблоны выражения
Awk включает следующие специальные паттерны:
- BEGIN — используется для выполнения действий перед обработкой записей.
- END — используется для выполнения действий после обработки записей.
Шаблон BEGIN обычно используется для установки переменных, а шаблон END для обработки данных из записей, таких как вычисления.
В следующем примере печатается «Начать обработку.», Затем печатается третье поле каждой записи и, наконец, «Завершить обработку».
Если программа имеет только шаблон BEGIN , действия выполняются, а ввод не обрабатывается. Если в программе есть только шаблон END , ввод обрабатывается перед выполнением действий правила.
Версия awk для Gnu также включает еще два специальных шаблона BEGINFILE и ENDFILE , которые позволяют выполнять действия при обработке файлов.
Комбинирование узоров
Awk позволяет комбинировать два или более шаблонов, используя логический оператор И ( && ) и логический оператор ИЛИ ( || ).
Вот пример, в котором оператор && используется для печати первого поля той записи, у которой третье поле больше 50, а четвертое поле меньше 30:
Встроенные переменные
Awk имеет ряд встроенных переменных, которые содержат полезную информацию и позволяют управлять обработкой программы. Ниже приведены некоторые из наиболее распространенных встроенных переменных:
- NF — количество полей в записи.
- NR — номер текущей записи.
- FILENAME — имя входного файла, который в данный момент обрабатывается.
- FS — Разделитель полей.
- RS — Разделитель записей.
- OFS — Разделитель выходных полей.
- ORS — разделитель выходной записи.
Вот пример, показывающий, как напечатать имя файла и количество строк (записей):
Переменные в AWK могут быть установлены в любой строке программы. Чтобы определить переменную для всей программы, поместите ее в шаблон BEGIN .
Изменение поля и разделителя записей
По умолчанию значение разделителя полей — любое количество пробелов или символов табуляции. Его можно изменить, установив в переменной FS .
Например, чтобы установить разделитель полей . вы бы использовали:
Разделитель полей также может содержать более одного символа:
При запуске однострочных команд awk в командной строке вы также можете использовать параметр -F для изменения разделителя полей:
По умолчанию разделителем записей является символ новой строки, который можно изменить с помощью переменной RS .
Вот пример, показывающий, как изменить разделитель записей на . :
Действия при отсутствии нагрузки
Действия awk заключаются в фигурные скобки ( <> ) и выполняются при совпадении с шаблоном. Действие может иметь ноль или более утверждений. Несколько операторов выполняются в том порядке, в котором они появляются, и должны быть разделены новой строкой или точкой с запятой ( ; ).
В awk поддерживается несколько типов операторов действий:
- Выражения, такие как присваивание переменных, арифметические операторы, операторы увеличения и уменьшения.
- Управляющие операторы, используемые для управления потоком программы ( if , for , while , switch и т. Д.)
- Операторы вывода, такие как print и printf .
- Составные утверждения, чтобы сгруппировать другие утверждения.
- Операторы ввода, чтобы управлять обработкой ввода.
- Операторы удаления для удаления элементов массива.
Оператор print вероятно, является наиболее часто используемым оператором awk. Он печатает форматированный вывод текста, записей, полей и переменных.
При печати нескольких элементов их нужно разделять запятыми. Вот пример:
Печатные материалы разделяются одиночными пробелами:
Если вы не используете запятые, между элементами не будет пробелов:
Печатные элементы объединены:
Когда print используется без аргументов, по умолчанию используется print $0 . Текущая запись будет напечатана.
Чтобы напечатать собственный текст, вы должны заключить текст в двойные кавычки:
Вы также можете печатать специальные символы, такие как новая строка:
Оператор printf дает вам больше контроля над форматом вывода. Вот пример вставки номеров строк:
printf не создает новую строку после каждой записи, поэтому мы используем n :
Следующая команда вычисляет сумму значений, хранящихся в третьем поле в каждой строке:
Вот еще один пример, показывающий, как использовать выражения и управляющие операторы для печати квадратов чисел от 1 до 5:
Однострочные команды, подобные приведенной выше, труднее понять и поддерживать. При написании более длинных программ следует создать отдельный программный файл:
Запустите программу, передав имя файла интерпретатору awk :
Вы также можете запустить программу awk как исполняемый файл, используя директиву shebang и установив интерпретатор awk :
Теперь вы можете запустить программу, введя:
Использование переменных оболочки в программах AWK
Если вы используете команду awk в сценариях оболочки, велика вероятность, что вам потребуется передать переменную оболочки программе awk. Один из вариантов — заключить программу в двойные вместо одинарных кавычек и подставить переменную в программе. Однако эта опция сделает вашу awk-программу более сложной, так как вам нужно будет избежать переменных awk.
Рекомендуемый способ использования переменных оболочки в программах awk — присвоить переменную оболочки переменной awk. Вот пример:
Выводы
Awk — один из самых мощных инструментов для работы с текстом.
Эта статья едва затрагивает поверхность языка программирования awk. Чтобы узнать больше об awk, ознакомьтесь с официальной документацией Gawk .
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.
Источник