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

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}'
  • Печать всех строк длиннее 80 символов:
    $ cat install.sh | awk '{if (length($0) > 80) print $0}'
  • Вывести пятое поле из вывода команды Как пользоваться командой netstat:
    $ netstat -ntu | awk '{print $5}'
  • Вывести строки, в которых значение первого столбца равно udp:
    # netstat -ntu | awk '$1 == "udp"'
  • Завершить процесс node (слушающему Порты TCP. Что такое TCP / IP порт -порт 1277) по его PID:
    #!/bin/bash
    kill -9 `lsof -i:1277 | awk '$0 ~ /node/ {print $2}'`
  • Вывести третью строку из файлы .bash_history
    # 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 - файл, который необходимо разобрать. Основными опциями являются:

  • -F fs — позволяет указать символ-разделитель для полей в записи (в каждой строке);
  • -f file — указывает имя файла, из которого нужно прочесть awk-скрипт;
  • -v var=value — объявляет переменную, которая будет использована в скрипте.

Создадим простейший 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 вы можете быстро и удобно обрабатывать текстовые файлы в терминале.

PQ VPS сервера в 28+ странах.