Поиск…


замечания

Название 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-подобными конструкциями.

`` обрабатывается в соответствии со следующими правилами:
  1. BEGIN ... и END ... являются необязательными и выполняются до или после обработки строк ввода awk.
  2. Для каждой строки в входе awk, если условие <condN> является мясом, выполняется соответствующий блок <program actions> .
  3. {<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


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow