Что такое АВК?
- 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.
Так что есть разные операторы сравнения
>:
больше, чем<:
меньше чем>=:
больше или равно<=:
меньше или равно==:
равно!=:
не равноsome_value ~ / pattern/:
— true, если some_value соответствует шаблону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
Удачного кодирования :).