Awk е мощен програмен език за обработка на данни, вграден в почти всяка система * nix. Прилича на език за програмиране с общо предназначение на повърхността, но е създаден, за да взима действия и да изпълнява действия, базирани на този вход. Ако трябва да обработвате текст въз основа на определени условия, awk почти винаги ще свърши работата по-бързо от езика с общо предназначение, като C. Това също е интерпретирано, за да избегнете продължителния процес на компилация и отстраняване на грешки в компилираните езици.

Още по-забавен факт : странното име на програмата е първоначалността на програмните й имена: Алфред Хо, Петер Уейнбергер и Брайън Керниган

Основният синтаксис на Аук

Когато се извиква на командния ред, awk следва основния образец по-долу:

 шаблон {action} файлов модел {action} файл ... 

Awk ще изпълни действието винаги, когато шаблонът съвпада в рамките на зададения файл. Ако не зададете файл, awk ще работи на стандартния изход. При съвпадение на шаблоните, awk може да приема регулярни изрази, както и програмни входове. Да разгледаме този основен пример по-долу:

 awk '/ com / {print $ 0}' имейли 

Тази еднолинейна програма ще отпечата всеки ред от файла "имейли", съдържащ символите com . В awk $0 отнася до текущия ред, който също е по подразбиране поведение. Линията би могла да бъде написана без $0, и тя щеше да работи еднакво.

Печат на полета

Тъй като awk може да разпознава и анализира сепаратори на полета, това е полезно за отпечатване на конкретни колони или редове от данни. За този пример ще използваме файла "/ etc / passwd".

 awk -F ":" '{print $ 1}' / etc / passwd 

Тази програма с една линия прави няколко неща. Знакът -F показва, че следващият знак ( : в този пример) трябва да се интерпретира като сепаратор на полета. Като ги отпечатва първото поле, определено от $1 .

Можем също да отпечатваме повече от едно поле наведнъж, като посочваме последователно полетата:

 awk -F ":" '{print $ 4 "" $ 5}' / etc / passw 

Тя ще произвежда продукция, която прилича на следното.

Това отпечатва четвъртото и петото поле на passwd с интервал между тях. Имайте предвид, че мястото е между двойни кавички. Това го определя като буквален знак в командата за отпечатване, така че е отпечатан както е написано. Можем да добавим и по-сложни буквали, за да почистим продукцията си:

 awk -F ":" '{print "процес:" $ 5 "\ t \ t" "директория:" $ 6}' / etc / passwd 

Това ще отпечата продукцията с етикети за идентификация. И ние можем да изведем всичко това на нов файл с помощта на карет (>).

 awk -F ":" '{print "процес:" $ 5 "\ t \ t" "директория:" $ 6}' / etc / passwd> processes.txt 

Можем да съчетаем това, което знаем досега, за обширно обработване на данните. Например, можем да използваме регулярни изрази, за да отпечатаме всички редове от документ, който съдържа валиден телефонен номер в САЩ.

 awk '/ ^(\+\d{1, 2}\s)?\(?\d{3}\)?[\s.-]\d{3}[\s.-]\d{4 } $ / {print} 'контакти 

Разширяване на съответната мощност на командата Awk

Awk също може да обработва информация с помощта на различни операнди. Това включва стандартни операнди като ==, <, >, <=, >=, и !=, Както и awk-специфични операнди ~ и !~, Което означава "съвпада" и "не съвпада" съответно. Тези операнди се използват при сравняване на регулярни изрази с булева логика, както и по-стандартни програмни фрази.

Примери за команден ред

 awk 'дължина ($ 0)> 80' данни 

Отпечатва всички редове, които са по-дълги от осемдесет символа във файла "данни". Забележете липсата на изявление за отпечатване: при липса на определено действие awk ще отпечата пълната линия, когато съответства на шаблон.

 $ 1 == "потребител" {print} 

Отпечатва всички линии, където първото поле е равно на низа "потребител". Без знак -F, awk ще използва бяло пространство като разделител по подразбиране. Също така имайте предвид, че awk и файла не са посочени. Това е за използване в скриптове в отделни файлове, както е описано по-долу.

 $ 5 ~ / root / {print $ 3} 

Разпечатва третото поле винаги, когато петото поле съвпада с регулярния израз /root/ .

 {if ($ 5! ~ / root /) {print $ 3}} 

Когато полето 5 не съвпада с /root/, отпечатайте полето three. Това използва инструкцията C-like, която също е съвместима с awk. Този формат позволява по-голяма гъвкавост за програмистите, запознати с езиците с общо предназначение.

Записване на скриптове в файлове

Awk скриптове могат да бъдат запазени и в файлове, които ви позволяват да запишете по-сложни програми:

 awk -f ~ / scripts / program.awk данни 

Когато използвате -f, awk изпълнява скрипта в указания файлов път, а именно program.awk . Командите в тази програма ще обработят файла "данни".

Действията могат да се изпълняват преди и след програмата, като се използват BEGIN и END :

 BEGIN {FS = ":"} # показва, че: е разделител на поле за програмата. #operations END {print "Вие сте готови"} # отпечатва весело съобщение за потребителя 

Както можете да видите по-горе, символът # започва коментар, който трае до края на реда.

заключение

Това ръководство само засяга основните елементи на awk. Има много повече да се изгради и проучи отвъд това. Проучете документацията на GNU за awk или The Awk Programming Language и awk учебника, написан от разработчиците на програмата.