AWK - интерпретируемый скриптовый C- подобный язык построчного разбора и обработки входного потока (например, текстового файла) по заданным шаблонам. Утилита AWK, была создана в 1977 году и объединила свойства фильтров sed и grep. В дальнейшем её возможности значительно расширились. Одним из расширений awk стала nawk, с помощью которой можно обращаться к нескольким файлам в одной программе. gawk - следующий этап развития awk, в ней реализованы как возможности nawk, так и стандартные средства awk.
Awk — это мощный инструмент для обработки текстовых данных в командной строке. Он идеально подходит для анализа данных, извлечения и преобразования текста, а также для выполнения различных вычислений.
AWK рассматривает входной поток как список записей. Каждая запись делится на поля. На основе этой информации выполняется некоторый определённый программистом алгоритм обработки. По умолчанию разделителем записей является символ новой строки (то есть записи — это то же самое, что строки), разделителем полей - символ пробела или табуляции, или последовательность таких символов. Символы-разделители можно явно определить в программе.
AWK- программа состоит из операторов (правил), имеющих вид:
шаблон {действие} шаблон {действие} . . .
Каждая запись поочерёдно сравнивается со всеми шаблонами, и каждый раз когда она соответствует шаблону, выполняется указанное действие. Если шаблон не указан, то действие выполняется для любой записи. Если не указано действие, то запись выводится.
Эти примеры демонстрируют базовую функциональность awk и могут быть адаптированы для различных сценариев обработки текстовых данных.
ls -lt /home/ftp_share/ftp_backup/ | awk 'END{print $9}'
$ cat install.sh | awk '{if (length($0) > 80) print $0}'
$ netstat -ntu | awk '{print $5}'
# netstat -ntu | awk '$1 == "udp"'
#!/bin/bash kill -9 `lsof -i:1277 | awk '$0 ~ /node/ {print $2}'`
# awk 'NR==3{print}' .bash_history
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
Этот пример подсчитывает, сколько раз каждое уникальное значение встречается в первом столбце, и выводит эти значения и их частоту.
Самая частая операция, которую вам придется выполнять в командной строке, где-то надо распарсить лог и вытащить количество 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 вы можете быстро и удобно обрабатывать текстовые файлы в терминале.