Какво е 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.

Така че има различни оператори за сравнение

  1. >:по-голямо от
  2. <:по-малко от
  3. >=:по-голямо или равно на
  4. <=: по-малко или равно на
  5. ==:равно на
  6. !=: не е равно на
  7. some_value ~ / pattern/: – вярно, ако some_value съответства на модела
  8. 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

Приятно кодиране :).