Awk — мощный язык программирования обработки данных, встроенный почти в каждую *nix-систему. На первый взгляд он выглядит как язык программирования общего назначения, но он создан для приема входных данных и выполнения действий на основе этих входных данных. Если вам нужно обработать текст на основе определенных условий, awk почти всегда выполнит эту работу быстрее, чем язык общего назначения, такой как C. Он также интерпретируется, поэтому вы избегаете длительного процесса компиляции и отладки скомпилированных языков.р>
Еще один интересный факт : странное имя программы представляет собой инициализм имен ее программистов: Альфред А хо, Питер Вайнбергер и Брайан К ерниган
Основной синтаксис Awk
При вызове из командной строки awk следует следующему базовому шаблону:
pattern { action } file pattern { action } file ...
Awk будет выполнять действие всякий раз, когда шаблон соответствует указанному файлу. Если вы не укажете файл, awk будет работать на стандартном выходе. При сопоставлении шаблонов awk может принимать как регулярные выражения, так и программный ввод. Давайте рассмотрим этот базовый пример ни
Contents
Основной синтаксис Awk
pan> '/com/ { print $0 }' emailsЭта однострочная программа распечатает каждую строку из файла «emails», содержащую символы com
. В awk $0
относится к текущей строке, что также является поведением по умолчанию. Эту строку можно было бы написать без $0,
, и она бы работала точно так же.
Печать полей
Поскольку awk может идентифицировать и анализировать разделители полей, он полезен для печати определенных столбцов или строк данных. В этом примере мы будем использовать файл «/etc/passwd».
awk -F":" '{ print $1 }' /etc/passwd
Эта однострочная программа делает несколько вещей. Флаг -F
указывает, что следующий символ (в данном примере :
) следует интерпретировать как разделитель полей. Awk печатает первое поле, указанное $1
.
Мы также можем печатать более одного поля одновременно, указав поля последовательно:
awk -F":" '{ print $4 " " $5}' /etc/passw
Вывод будет выглядеть следующим образом.
При этом четвер
Печать полей
аpasswd
будут распечатаны с пробелом между ними. Обратите внимание, что пробел находится между двойными кавычками. Это определяет его как буквальный символ в команде печати, поэтому он печатается так, как написано. Мы также можем добавить более сложные литералы, чтобы очистить вывод:
awk -F":" '{ print "process: " $5 "\t\t " "directory: "$6}' /etc/passwd
Вывод будет распечатан с этикетками для идентификации. И мы можем вывести все это в новый файл с помощью курсора (>).
awk -F":" '{ print "process: " $5 "\t\t " "directory: "$6}' /etc/passwd > processes.txt
Мы можем объединить все, что мы знаем, для более широкой обработки данных. Например, мы можем использовать регулярные выражения для печати всех строк документа, содержащего действительный номер телефона в США.
awk '/^(\+\d{1,2}\s)?\(?\d{3}\)?[\s.-]\d{3}[\s.-]\d{4}$/ { print }' contacts
Расширение возможностей сопоставления команды Awk
Awk также может обрабатывать информацию, используя различные операнды. Сюда входят стандартные операнды, такие как ==
, <
, >
, <=
, >=
, и !=
, а также специфичные для awk операнды ~
и !~,
, которые означают «совпадает» и «не соответствует» соответственно. Эти операнды используются при сравнении регулярных выражений с булевой логикой, а также с более стандартными программными фразами.
Примеры команд Awk
awk 'length($0) > 80' data
Печатает все строки длиной более восьмидесяти символов в файле data. Обратите внимание на отсутствие оператора печати: при отсутствии указанного действия awk будет печатать всю строку всякий раз, когда шаблон соответствует.
$1 == "user" { print }
Печатает все строки, где первое поле равно строке «пользователь». Без флага -F
awk будет использовать пробел в качестве разделителя полей по умолчанию. Также обратите внимание, что awk и файл не указаны. Это предназначено для использования в сценариях в отдельных файлах, как описано ниже.
$5 ~ /root/ { print $3 }
Печатает третье поле всякий раз, когда пятое поле соответствует регулярному выражению /root/
.
{ if ( $5 !~ /root/ ) { print $3 } }
Если поле 5 не соответствует /root/
, напечатайте третье поле. При этом используется оператор if
в стиле C, который также совместим с awk. Этот формат обеспечивает большую гибкость для программистов, знакомых с языками общего назначения.
Сохранение скриптов в файлах
Сценарии Awk также можно сохранять в файлах, которые позволяют сохранять