Содержание

AWK примеры использования

AWK - интерпретируемый скриптовый C- подобный язык построчного разбора и обработки входного потока (например, текстового файла) по заданным шаблонам. Утилита AWK, была создана в 1977 году и объединила свойства фильтров sed и grep. В дальнейшем её возможности значительно расширились. Одним из расширений awk стала nawk, с помощью которой можно обращаться к нескольким файлам в одной программе. gawk - следующий этап развития awk, в ней реализованы как возможности nawk, так и стандартные средства awk.

Awk — это мощный инструмент для обработки текстовых данных в командной строке. Он идеально подходит для анализа данных, извлечения и преобразования текста, а также для выполнения различных вычислений.

AWK рассматривает входной поток как список записей. Каждая запись делится на поля. На основе этой информации выполняется некоторый определённый программистом алгоритм обработки. По умолчанию разделителем записей является символ новой строки (то есть записи — это то же самое, что строки), разделителем полей - символ пробела или табуляции, или последовательность таких символов. Символы-разделители можно явно определить в программе.

AWK- программа состоит из операторов (правил), имеющих вид:

 шаблон {действие}
 шаблон {действие}
 . . .

Каждая запись поочерёдно сравнивается со всеми шаблонами, и каждый раз когда она соответствует шаблону, выполняется указанное действие. Если шаблон не указан, то действие выполняется для любой записи. Если не указано действие, то запись выводится.

Действие может состоять из последовательности операторов, разделяемой точкой с запятой, переводом строки или закрывающей скобкой.

Примеры использования AWK

Эти примеры демонстрируют базовую функциональность awk и могут быть адаптированы для различных сценариев обработки текстовых данных.

Вывод столбцов из файла

awk '{print $1, $3}' filename.txt

Эта команда выводит первый и третий столбцы каждой строки файла `filename.txt`.

Подсчет и суммирование

awk '{sum += $1} END {print sum}' filename.txt

Здесь awk суммирует значения в первом столбце каждой строки и выводит итоговую сумму после обработки всех строк.

Фильтрация по шаблону
awk '/pattern/ {print $0}' filename.txt

Эта команда печатает только те строки файла, которые соответствуют заданному шаблону `pattern`.

Форматированный вывод

awk '{printf "Name: %s, ID: %d\n", $1, $2}' filename.txt

Тут awk использует функцию print` для форматированного вывода определенных столбцов.

Выполнение арифметических операций

awk '{print $1, $2, $1 * $2}' filename.txt

В этом примере awk умножает значения первого и второго столбцов каждой строки.

Обработка нескольких файлов

awk '{print FILENAME, NR, $0}' file1.txt file2.txt

Эта команда выводит имя файла, номер строки и содержимое строки для нескольких файлов.

Фильтрация по условию

awk '$3 > 100 {print $1, $3}' filename.txt

Здесь awk выводит первый и третий столбцы для строк, где значение в третьем столбце больше 100.

Использование переменных

awk -v var=100 '{if ($1 > var) print $0}' filename.txt

В этом примере используется переменная var, и awk печатает строки, где значение первого столбца больше var.

Редактирование текста в строке

awk '{sub(/old/, "new"); print $0}' filename.txt

Тут awk заменяет текст old на new в каждой строке файла.

Группировка и агрегация

awk '{count[$1]++} END {for (word in count) print word, count[word]}' filename.txt

Этот пример подсчитывает, сколько раз каждое уникальное значение встречается в первом столбце, и выводит эти значения и их частоту.

Парсинг файлов с использованием AWK

Самая частая операция, которую вам придется выполнять в командной строке, где-то надо распарсить лог и вытащить количество IP-адресов, где-то - подсчитать количество вхождений каких-то слов и так далее. Возможно, даже придется парсить csv файл и обрабатывать каждую строчку каким-то хитрым образом. Конечно, большую часть из всего этого можно сделать с помощью стандартных утилит типа cat, grep, wc, head, tail и других, но иногда намного проще написать скрипт на awk для обработки текстовых файлов.

По сути awk - это небольшой язык программирования для обработки текстов. Команда его запуска выглядит так:

$ awk options program file

Где options - это опции, передаваемые awk, program - скрипт, который будет обрабатывать файл, и собственно file - файл, который необходимо разобрать. Основными опциями являются:

Создадим простейший awk скрипт, который будет читать построчно файл /etc/passwd, разделять его по символу ':' и выводить только первый элемент - то есть имя пользователя.

$ cat /etc/passwd | awk -F ':' '{print $1}'
root
daemon
bin
sys
sync
games
man

С помощью команды cat мы выводим файл на экран и отправляем весь вывод на вход команде awk, которой указываем, что каждую строку надо разбить по символу ':', после чего - вывести первый элемент ($1). В awk можно писать несколько команд, разделяя их точкой с запятой:

$ cat /etc/passwd | awk -F ':' '{print $1; print $3}'

Блок, указанный в фигурных скобках, будет выполнен для каждой строки. То есть awk читает строку и выполняет код, указанный в этих скобках. Если вы хотите разово выполнить какое-то действие, например, объявить переменную в самом начале или в завершении вывести общую информацию по файлу, то для этого надо использовать блоки BEGIN & END. Давайте напишем простой скрипт, который считает количество строк в файле:

$ cat /etc/passwd | awk 'BEGIN {a = 0} {a=a+1} END {print a}'
26

Как вы уже увидели - блоки BEGIN{} и END{} выполнились только один раз. А вот блок {} выполнился 26 раз - по количеству строк в файле. Давайте рассмотрим еще один пример - просуммируем все uid в /etc/passwd:

$ cat /etc/passwd | awk -F ':' 'BEGIN {a = 0} {a=a+$3} END {print a}'
67508

Мы разбиваем каждую строку /etc/passwd по символу ':', объявляем переменную a равную 0, в каждой строке вытаскиваем uid ($3) и прибавляем к перемнной a. И в завершение выводим переменную a на экран.

Помимо простых операций, awk поддерживает и условия if. С помощью awk вы можете быстро и удобно обрабатывать текстовые файлы в терминале.