Что такое АВК?

  • AWK, одна из самых известных утилит для обработки текста или фильтрации текста в GNU/Linux. Очень мощный язык программирования, решающий сложные проблемы в очень меньшем количестве строк кода.
  • Его название происходит от фамилий его авторов — Альфреда Ахо, Питера Вайнбергера и Брайана Кернигана.
  • Поддерживается FSF (Фонд свободного программного обеспечения).
  • Базовый синтаксис awk — это файл awk ‘options’.

Распечатать файл с помощью 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, будет напечатана аналогичным образом. мы можем использовать регулярное выражение для печати соответствующего шаблона.

Распечатать столбец с помощью 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/: — true, если some_value соответствует шаблону
  8. some_value !~ / pattern/: — истина, если какое-то_значение не соответствует шаблону.

Если мы хотим напечатать знаки Дипака:

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:

ключевое слово next чем-то похоже на continue в другом языке программирования, таком как 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», «ИСКЛЮЧЕНИЕ»; next}этопроверить, больше ли 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

Удачного кодирования :).