awk учебник
Начало работы с awk
Поиск…
замечания
Название AWK происходит от последних инициалов его создателей Альфреда В. Ахо, Питера Дж. Вайнбергера и
Брайан У. Керниган.
Ресурсы
Версии
| название | Первоначальная версия | Версия | Дата выхода |
|---|---|---|---|
| POSIX awk | 1992 | IEEE Std 1003.1, выпуск 2013 | 2013-04-19 |
| Один True Awk или nawk или BWK awk | 198x | - | 2012-12-20 |
| GNU awk или gawk | 1986 | 4.1.3 | 2015-05-19 |
Привет, мир
Пример Hello world - это просто:
awk 'BEGIN {print "Hello world"}'
Самая основная программа awk состоит из истинного значения (обычно 1 ) и делает awk echo его входным:
$ date | awk '1'
Mon Jul 25 11:12:05 CEST 2016
Поскольку «hello world» также является истинным значением, вы также можете сказать:
$ date | awk '"hello world"'
Mon Jul 25 11:12:05 CEST 2016
Однако ваше намерение становится намного яснее, если вы пишете
$ date | awk '{print}'
Mon Jul 25 11:12:05 CEST 2016
вместо.
Как запустить AWK-программы
Если программа короткая, вы можете включить ее в команду, которая запускает awk:
awk -F: '{print $1, $2}' /etc/passwd
В этом примере с помощью командной строки -F: мы советуем awk использовать: как разделитель полей ввода. Это то же самое, что и
awk 'BEGIN{FS=":"}{print $1,$2}' file
Альтернативно, мы можем сохранить весь awk-код в awk-файле и вызвать эту awk-программу следующим образом:
awk -f 'program.awk' input-file1 input-file2 ...
program.awk может быть любой многострочной программой, то есть:
# file print_fields.awk
BEGIN {print "this is a header"; FS=":"}
{print $1, $2}
END {print "that was it"}
И затем запустите его с помощью:
awk -f print_fields.awk /etc/passwd #-f advises awk which program file to load
Или в целом:
awk -f program-file input-file1 input-file2 ...
Преимущество наличия программы в отдельном файле заключается в том, что вы можете написать программу с правильной идентификацией, чтобы иметь смысл, вы можете включать комментарии с # и т. Д.
AWK по примерам
AWK - это язык строковых манипуляций, используемый в основном в системах UNIX. Идея AWK заключалась в том, чтобы создать универсальный язык для использования при работе над файлами, который не был слишком сложным для понимания.
AWK имеет некоторые другие варианты, но основная концепция - то же самое, только с дополнительными функциями. Этими другими вариантами являются NAWK и GAWK. GAWK содержит все возможности обоих, в то время как NAWK на один шаг выше AWK, если хотите.
Самый простой способ думать о AWK - это рассмотреть, что он имеет две основные части. Шаблон и действие.
Вероятно, самый простой пример AWK: (См. Также: Hello World)
BEGIN {print "START"}
{print }
END {print "STOP" }
Здесь ключевыми словами BEGIN и END являются шаблон, в то время как действие находится внутри {}. Этот пример был бы бесполезным, но для внесения изменений в полезную функцию потребовались бы незначительные изменения.
BEGIN {print "File\tAuthor"}
{print $8, "\t", $3}
END {print " - DONE - "}
Здесь \t представляет символ Tab и используется для выравнивания границ выходной строки. $ 8 и $ 3 похожи на использование, которое видно в Shell Scripts , но вместо использования 3-го и 8-го аргументов он использует 3-й и 8-й столбцы строки ввода.
Таким образом, этот пример будет печатать: File Author в верхней строке, в то время как вторая строка связана с файловыми путями. $ 8 - это имя файла, 3 доллара - владелец (при просмотре пути к каталогу это будет более понятным). Наконец, нижняя строка будет печататься, как и следовало ожидать - DONE -
Кредит для вышеуказанного примера приведен на http://www.grymoire.com/Unix/Awk.html
Справочный файл
coins.txt от Грега Гебеля:
gold 1 1986 USA American Eagle
gold 1 1908 Austria-Hungary Franz Josef 100 Korona
silver 10 1981 USA ingot
gold 1 1984 Switzerland ingot
gold 1 1979 RSA Krugerrand
gold 0.5 1981 RSA Krugerrand
gold 0.1 1986 PRC Panda
silver 1 1986 USA Liberty dollar
gold 0.25 1986 USA Liberty 5-dollar piece
silver 0.5 1986 USA Liberty 50-cent piece
silver 1 1987 USA Constitution dollar
gold 0.25 1987 USA Constitution 5-dollar piece
gold 1 1988 Canada Maple Leaf
Минимальная теория
Общий awk однострочный:
awk <awk program> <file>
или же:
<shell-command> | awk <awk program>
<shell-command> и <file> адресуются как вход awk .
<awk program> - это код, следующий за этим шаблоном (одиночный, не двойной, кавычки):
'BEGIN {<init actions>};
<cond1> {<program actions>};
<cond2> {<program actions>};
...
END {<final actions>}'
где:
-
<condX>условие чаще всего является регулярным выражением/re/, которое должно совпадать с строками ввода awk; -
<* actions>- это последовательности операторов , аналогичные командам оболочки, снабженные C-подобными конструкциями.
`` обрабатывается в соответствии со следующими правилами:
-
BEGIN ...иEND ...являются необязательными и выполняются до или после обработки строк ввода awk. - Для каждой строки в входе awk, если условие
<condN>является мясом, выполняется соответствующий блок<program actions>. -
{<program actions>}умолчанию{print $0}.
Условия могут быть объединены со стандартными логическими операторами:
/gold/ || /USA/ && !/1986/
где && имеет приоритет над || ;
Оператор print . print item1 item2 печатает элементы в STDOUT.
Элементы могут быть переменными ( X , $0 ), строками («привет») или числами.
item1, item2 сопоставляются со значением переменной OFS ;
item1 item2 justapoxed ! Используйте item1 " " item2 для пробелов или printf для получения дополнительных функций.
Переменные не нужны $ , т.е.: print myVar;
В awk встроены следующие специальные переменные:
-
FS: действует как разделитель полей для разделения строк ввода awk в полях. Я могу быть единственным персонажем,FS="c"; пустая строка,FS=""(тогда каждый отдельный символ становится отдельным полем); регулярное выражение без косых черт,FS="re";FS=" "означает пробелы пробелов и вкладок и значение по умолчанию. -
NF: количество полей для чтения; -
$1,$2, ...: 1-ое поле, 2-е поле. и т. д. текущей входной линии, -
$0: текущая строка ввода; -
NR: текущий номер строки. -
OFS: строка для сортировки полей при печати. -
ORS: разделитель выходной записи, по умолчанию - новая строка. -
RS: разделитель строки ввода (записи). По умолчанию используется новая строка. Установить какFS. -
IGNORECASE: влияет на FS и RS при регулярном выражении;
Примеры
Фильтруйте линии по gold regexp и посчитайте их:
# awk 'BEGIN {print "Coins"} /gold/{i++; print $0} END {print i " lines out of " NR}' coins.txt
Coins
gold 1 1986 USA American Eagle
gold 1 1908 Austria-Hungary Franz Josef 100 Korona
gold 1 1984 Switzerland ingot
gold 1 1979 RSA Krugerrand
gold 0.5 1981 RSA Krugerrand
gold 0.1 1986 PRC Panda
gold 0.25 1986 USA Liberty 5-dollar piece
gold 0.25 1987 USA Constitution 5-dollar piece
gold 1 1988 Canada Maple Leaf
9 lines out of 13
По умолчанию print $0 действие и условие на основе внутренней переменной awk NR :
# awk 'BEGIN {print "First 3 coins"} NR<4' coins.txt
First 3 coins
gold 1 1986 USA American Eagle
gold 1 1908 Austria-Hungary Franz Josef 100 Korona
silver 10 1981 USA ingot
Форматирование с помощью C-style `printf`: # awk '{printf ("%s \t %3.2f\n", $1, $2)}' coins.txt
gold 1.00
gold 1.00
silver 10.00
gold 1.00
gold 1.00
gold 0.50
gold 0.10
silver 1.00
gold 0.25
silver 0.50
silver 1.00
gold 0.25
gold 1.00
Примеры условий
awk 'NR % 6' # prints all lines except those divisible by 6
awk 'NR > 5' # prints from line 6 onwards (like tail -n +6, or sed '1,5d')
awk '$2 == "foo"' # prints lines where the second field is "foo"
awk '$2 ~ /re/' # prints lines where the 2nd field mateches the regex /re/
awk 'NF >= 6' # prints lines with 6 or more fields
awk '/foo/ && !/bar/' # prints lines that match /foo/ but not /bar/
awk '/foo/ || /bar/' # prints lines that match /foo/ or /bar/ (like grep -e 'foo' -e 'bar')
awk '/foo/,/bar/' # prints from line matching /foo/ to line matching /bar/, inclusive
awk 'NF' # prints only nonempty lines (or: removes empty lines, where NF==0)
awk 'NF--' # removes last field and prints the line
Добавив действие {...} можно напечатать определенное поле, а не всю строку, например:
awk '$2 ~ /re/{print $3 " " $4}'
печатает третье и четвертое поле линий, где второе поле выполняет регулярное выражение / re /.
Некоторые строковые функции
Функция substr() :
# awk '{print substr($3,3) " " substr($4,1,3)}'
86 USA
08 Aus
81 USA
84 Swi
79 RSA
81 RSA
86 PRC
86 USA
86 USA
86 USA
87 USA
87 USA
88 Can
match(s, r [, arr]) возвращает позицию в s где выполняется регулярное выражение r и устанавливает значения RSTART и RLENGTH . Если аргумент arr предоставляется, он возвращает массив arr где элементы устанавливаются в согласованное подвыражение в скобках. Сопоставления 0-го элемента arr устанавливаются во все регулярное выражение. Также выражения arr[n, "start"] и arr[n, "length"] предоставляют начальную позицию и длину каждой подстроки.
Более строковые функции:
sub(/regexp/, "newstring"[, target])
gsub(/regexp/, "newstring"[, target])
toupper("string")
tolower("string")
Заявления
Простым утверждением часто бывает одно из следующего:
variable = expression
print [ expression-list ]
printf format [ , expression-list ]
next # skip remaining patterns on this input line
exit # skip the rest of the input
Если stat1 и stat2 являются stat2 , следующие утверждения также:
{stat}
{stat1; stat2}
{stat1
stat2}
if ( conditional ) statement [ else statement ]
Следующими стандартными конструкциями типа C являются:
if ( conditional ) statement [ else statement ]
while ( conditional ) statement
for ( expression ; conditional ; expression ) statement
break # usual C meaning
continue # usual C meaning
Цикл C-стиля для печати элемента описания переменной длины, начиная с поля 4:
# awk '{out=""; for(i=4;i<=NF;i++){out=out" "$i}; print out}' coins.txt
USA American Eagle
Austria-Hungary Franz Josef 100 Korona
USA ingot
Switzerland ingot
RSA Krugerrand
RSA Krugerrand
PRC Panda
USA Liberty dollar
USA Liberty 5-dollar piece
USA Liberty 50-cent piece
USA Constitution dollar
USA Constitution 5-dollar piece
Canada Maple Leaf
Обратите внимание, что i инициализируется равным 0.
Если условия и вычисления применяются к нумеру:
# awk '/gold/ {if($3<1980) print $0 "$" 425*$2}' coins.txt
gold 1 1908 Austria-Hungary Franz Josef 100 Korona $425
gold 1 1979 RSA Krugerrand $425
AWK исполняемый скрипт
#!/usr/bin/gawk -f
# This is a comment
(pattern) {action}
...
Передача переменных оболочки
# var="hello"
# awk -v x="$var" 'BEGIN {print x}'
hello