В Linux awk е динамо за манипулиране на текст от командния ред, както и мощен скриптов език. Ето въведение в някои от най-готините му функции.
Как awk получи името си
Командата awk е наречена с помощта на инициалите на тримата души, написали оригиналната версия през 1977 г.: Алфред Ахо, Питър Вайнбергер, и Брайън Керниган. Тези трима мъже бяха от легендата AT&T Bell Laboratories Пантеон на Unix. С приноса на много други оттогава awk продължава да се развива.
Това е пълен скриптов език, както и пълен набор от инструменти за манипулиране на текст за командния ред. Ако тази статия възбуди апетита ви, можете проверете всеки детайл за awk и неговата функционалност.
Правила, модели и действия
awk работи върху програми, които съдържат правила, състоящи се от модели и действия. Действието се изпълнява върху текста, който съответства на шаблона. Моделите са затворени в къдрави скоби ({}). Заедно модел и действие образуват правило. Цялата програма awk е затворена в единични кавички (‘).
Нека да разгледаме най-простия тип програма awk. Той няма шаблон, така че съответства на всеки ред текст, въведен в него. Това означава, че действието се изпълнява на всеки ред. Добре използвайте го на изхода от който командва.
Ето стандартния изход от кой:
who
Може би нямаме нужда от цялата тази информация, а по-скоро просто искаме да видим имената в сметките. Можем да пренесем изхода от who в awk и след това да кажем на awk да отпечата само първото поле.
По подразбиране awk счита полето за низ от знаци, заобиколен от интервали, началото на ред или края на ред. Полетата се идентифицират със знак за долар ($) и число. И така, $1 представлява първото поле, което ще използваме с действието за печат, за да отпечатаме първото поле.
Пишем следното:
who | awk '{print $1}'
awk отпечатва първото поле и изхвърля останалата част от реда.
Можем да отпечатаме толкова полета, колкото пожелаем. Ако добавим запетая като разделител, awk отпечатва интервал между всяко поле.
Пишем следното, за да отпечатаме и времето, в което лицето е влязло (четвърто поле):
who | awk '{print $1,$4}'
Има няколко специални идентификатора на полета. Те представляват целия ред на текста и последното поле в реда на текста:
$0: Представлява целия ред от текст.
$1: Представлява първото поле.
$2: Представлява второто поле.
$7: Представлява седмото поле.
$45: Представлява 45-то поле.
$NF: означава „брой полета“ и представлява последното поле.
Ще напишем следното, за да изведем малък текстов файл, който съдържа кратък цитат, приписан на Денис Ричи:
cat dennis_ritchie.txt
Искаме awk да отпечата първото, второто и последното поле на цитата. Имайте предвид, че въпреки че е обвит в прозореца на терминала, това е само един ред текст.
Набираме следната команда:
awk '{print $1,$2,$NF}' dennis_ritchie.txt
Ние не познаваме тази „простота“. е 18-то поле в реда на текста и не ни интересува. Това, което знаем, е, че е последното поле и можем да използваме $NF, за да получим стойността му. Периодът просто се счита за друг герой в