Какво е AWK?
- AWK, една от най-известните помощни програми за обработка на текст или филтриране на текст в GNU/Linux. Много мощен език за програмиране, решава сложни проблеми с много по-малко редове кодове.
- Името му произлиза от фамилните имена на неговите автори - Алфред Ахо, Питър Уайнбергер и Браян Керниган.
- Поддържа се от FSF (Free Software Foundation).
- Основният синтаксис на awk е файл с опции за awk.
Отпечатайте файл с помощта на awk?
Подобен е на cat /etc/resolve.conf. Отпечатва съдържанието на файла в конзолата.
awk ‘//{print}’ /etc/resolv.conf or awk ‘{print}’ /etc/resolv.conf
разликата между горните два примера е, че в първия пример той ще отпечата или ако искате да отпечатате конкретен ред, който съдържа шаблони, докато във втория пример това е просто отпечатване на съдържанието в конзолата, например,
awk ‘/8.8.8.8/{print}’ /etc/resolv.conf
той ще отпечата ред, който съдържа „8.8.8.8“. основният синтаксис на първия пример е awk ‘/pattern/print’ файл.
шаблон: може да бъде регулярен израз или низ.
awk ‘/^saurav/{print}’ /etc/passwd.
в горния примерен ред, който започва със saurav, ще се отпечата.
awk ‘/*sql$/{print}’ /etc/passwd
в горния пример редът, завършващ с sql, ще се отпечата по същия начин. можем да използваме regex за отпечатване на съответстващ шаблон.
Отпечатване на колона с помощта на awk?
По подразбиране IFS (Междинен разделител на поле) в bash е интервал. подобно на AWK по подразбиране, IFS е табулация или интервал.
Ето файла, който съдържа 3 колони, които ще използвам, за да обясня:
SEQ Name Subject Marks 1) Saurav Physics 80 2) Deepak Maths 90 3) Dhoni Biology 87 4) Kedar English 85 5) Pandya History 89
Отпечатване на 3-та колона: Тук ще отпечатаме 3-та колона
awk ‘//{print $3}’ example.txt Output: Subject Physics Maths Biology English History
Нека да видим как да отпечатате колона 2 и 4
awk ‘//{print $2 $4}’ example.txt Output: NameMarks Saurav80 Deepak90 Dhoni87 Kedar85 Pandya89
тук можем да видим, че awk отпечатва колона, която не е разделена.ако искате да разделите колоните, използвайте ‘,’ (запетая).
awk ‘//{print $2, $4;}’ example.txt Output: Name Marks Saurav 80 Deepak 90 Dhoni 87 Kedar 85 Pandya 89
Използване на printf в awk?
Printf помага тук за форматиране на изхода за печат.
Например:
awk ‘NR>1 {printf “Marks=%d Subject=%s\n”,$4, $3 }’ example.txt Output: Marks=80 Subject=Physics Marks=90 Subject=Maths Marks=87 Subject=Biology Marks=85 Subject=English Marks=89 Subject=History
Както можете да видите в горния пример, функцията printf, подобна на езика C, работи тук.
Оператори за сравнение в AWK:
В awk можете да сравнявате колони и да печатате в конзолата
Например:
awk ‘$4 > 85 {print;}’ example.txt SEQ Name Subject Marks 2) Deepak Maths 90 3) Dhoni Biology 87 5) Pandya History 89
в горния пример отпечатайте реда, чиято 4-та колона (знаци) е по-голяма от 85.
Така че има различни оператори за сравнение
>:
по-голямо от<:
по-малко от>=:
по-голямо или равно на<=:
по-малко или равно на==:
равно на!=:
не е равно наsome_value ~ / pattern/:
– вярно, ако some_value съответства на моделаsome_value !~ / pattern/:
– вярно, ако някаква_стойност не съответства на модела.
Ако искаме да отпечатаме знаците на Deepak:
awk ‘$2 ~ “Deepak” { print $0 ; }’ example.txt Output: 2) Deepak Maths 90
по подобен начин можем да получим съвпадащия ред, използвайки оператори за сравнение.
Сложна операция в AWK:
В awk можем да комбинираме множество изрази, за да филтрираме текст. Можем да използваме && (и) и || (или) оператори за постигане на това.
Нека видим някои примери.
Отпечатайте оценки на хората, които имат оценки над 85 по история.
awk ‘($4 >= 85 ) && ($3 ~ “History”) { print $0 ; }’ example.txt OUTPUT: 5) Pandya History 89
Отпечатайте оценки на хората, които имат оценки над 85 или чийто предмет е история.
awk '($4 >= 85 ) || ($3 ~ "History") { print $0 ; }' example.txt OUTPUT: 2) Deepak Maths 90 3) Dhoni Biology 87 4) Kedar English 85 5) Pandya History 89
по подобен начин можем да постигнем комбиниране на множество изрази за филтриране на текста.
Следваща ключова дума в AWK:
следващата ключова дума е донякъде подобна на продължаване в различен език за програмиране като java, scala. Това наистина помага, когато има множество изрази за оценка и единственият, който искате да отпечатате, пропуснете всички изрази.
Например:
awk ‘ FNR == 1 {next}; $4 >= 85 { printf “%s\t%s\n”, $0,”EXEMPTION” ; next} $4 < 85 {printf “%s\t%s\n”, $0,”PASSED”;} ‘ example.txt Output: 1) Saurav Physics 80 PASSED 2) Deepak Maths 90 EXEMPTION 3) Dhoni Biology 87 EXEMPTION 4) Kedar English 85 EXEMPTION 5) Pandya History 89 EXEMPTION
В горния пример, както виждаме
първи ред FNR == 1 {следващ}проверете дали първият му ред или ред след това отидете на следващия.
втори ред $4 ›= 85 { printf “%s\t%s\n”, $0,”ОСВОБОЖДАВАНЕ” ; следващ}товапроверете дали 4-та колона (знаци) е по-голямо от 85, след това отпечатайте и отидете на следващия ред.
Променливи и числови изрази:
Променливите са контейнери, които съхраняват някаква стойност, която се съхранява в паметта като други езици за програмиране.
Синтаксис:
variable=value
Пример:
marks=10 name=saurav
Числовите изрази са изразите, които правят числови изрази. Като добавяне или деление на някои числа, подобно на други езици за програмиране.
Syntax: operand operator operand Example: var1=1 var2=2 var3= var1 + var2
Нека видим някои примери:
Отпечатайте номера на реда с всеки ред в конзолата.
awk ‘FNR==1 {next}; line= $0 //store content reads by awk { line_no=+1 ; printf “%d\t%s\n”, line_no,line ; }’ // increment line_no with every line read example.txt OUTPUT: 1 1) Saurav Physics 80 2 2) Deepak Maths 90 3 3) Dhoni Biology 87 4 4) Kedar English 85 5 5) Pandya History 89
Приятно кодиране :).