AWK примеры использования
AWK - интерпретируемый скриптовый C- подобный язык построчного разбора и обработки входного потока (например, текстового файла) по заданным шаблонам. Утилита AWK, была создана в 1977 году и объединила свойства фильтров sed и grep. В дальнейшем её возможности значительно расширились. Одним из расширений awk стала nawk, с помощью которой можно обращаться к нескольким файлам в одной программе. gawk - следующий этап развития awk, в ней реализованы как возможности nawk, так и стандартные средства awk.
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
Этот пример подсчитывает, сколько раз каждое уникальное значение встречается в первом столбце, и выводит эти значения и их частоту.
Парсинг файлов с использованием AWK
Самая частая операция, которую вам придется выполнять в командной строке, где-то надо распарсить лог и вытащить количество 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 вы можете быстро и удобно обрабатывать текстовые файлы в терминале.
📌 Для тестирования скриптов, установщиков VPN, Python ботов рекомендуем использовать надежные VPS на короткий срок. Если вам нужна помощь с более сложными задачами, вы можете найти фрилансера, который поможет с настройкой. Узнайте больше о быстрой аренде VPS для экспериментов и о фриланс-бирже для настройки VPS, WordPress. 📌
💥 Подпишись в Телеграм 💥 и задай вопрос по сайтам и хостингам бесплатно!
7 Самых Популярных Статей
- Как запустить скрипты и веб-приложения на Python
- Что такое страны TIER 1,2,3
- 7 способов сравнения файлов по содержимому в Windows или Linux
- Установка и тестирование веб-панели HestiaCP
- Китайский VPN Shadowsocks простая установка и настройка
- top, htop, atop определение загрузки ОС (Load average, LA)
- Использование rsync в примерах