AWK в примерах

awk tolower

Преобразование регистра

Преобразование строк результата к нижнему регистру и пропуск 1-ой строки (обычно заголовок).
Получаем список доменов с nic.ru и преобразуем его в удобный для работы

wget 'https://www.nic.ru/downloads/domains.gz?login=14331/NIC-REG/adm&password=MySecretPass' -O domains.gz
gzip -d domains.gz
awk ' NR >= 2 { print tolower($1) }' domains > .domains

к верхнему регистру

USER="Developer garry"; echo $USER | awk '{ print tolower($1), toupper($2)}'
# ответ
developer GARRY

Отбор по номеру строки

Посмотреть только активные порты TCP4, отсортированные и без лишнего

netstat -tulpn | awk 'NR > 2 { print $1,$4 }' | grep "tcp " | sort

NR (NumberRow) задает строки, которые надо обрабатывать.

Вывести строку с определенным номером

Выбрать строку с номером 17:

awk 'NR==17 {print $1}' /etc/passwd

Включить вывод 1-ой строки

Чтобы не съедалась первая строка при обработке файла, который начинается с разделителя (первый символ является разделителем), надо после FS прописать команду “$0 = $0”

ls -1 /tank/volumes/*  | awk '{ FS="/"; $0 = $0; print $4 }'

Grep в качестве предфильтра

Можно до обработки awk сразу “отсечь” по типу grep нужную строку (строки)

free -m | awk '/^Mem/{print $2}'
3951

Сумма по колонке

Просуммировать 4-ый столбец (размер дисков в Гб)

openstack volume list --all-projects --long -f value | grep "Simple EBS" | awk '{s += $4} END {print s}'

Применяется конструкция вида: ‘{sum += $4} end {print sum}’

Максимальное значение

Задача - найти максимальное значение по колонке.

idx() - это имя функции awk, можно выбрать другое имя переменной, например index.
idx=3  - выборка по 3-ому полю 
NR==2 - начинать подсчет со 2-ой строки (если есть заголовок)

$ awk -v idx=3 'NR==2 || $idx>max{max=$idx} END {print max}' file

Функция split (s,M,c)

Фильтрация IP-адресов из файла s - строка, M - массив, c - разделитель

awk '{ i = split($0, RID, ",");
   for (j=1; j<=i; j++)
   print ("RID["j"]=" RID[j])
 }' input_file

Фильтр IP-адресов

Код, фильтрующий строки содержащие только ip адрес, скрипт сортирует ip адреса и удаляет дубли

cat /etc/hosts | grep "^[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*" | sort | uniq
Упрощенный вариант (не всегда правильно отработает) с выделением 1-го поля (собственно IP-адрес)
cat /etc/hosts | grep "^[0-9]" | cut -f1

Смена прав

Пример, как изменить права только на каталоги в текущей директории:

chmod 775 `ls -l | grep drw | awk '{print $9}'`

Обработка списка пакетов

Вывод двух основных колонок списка пакетов linux, полученных командой ‘dpkg -l’:

cat store-soft.txt | awk '{FS=" "; print $2,"|",$5" "$6" "$7" "$9" "$10" "$11" "$12}' > store-soft2.txt

Здесь разделителем полей исходного файла является пробел (конкатенация параметров поля Description c 5-го по 12-е).

Выходной разделитель: “|”

Фильтрация выводимых полей

Вывод полной информации о пользователях системы с идентификаторами uid больше 1000:

awk -F: '$3 > 999 {print $0}' /etc/passwd
То-же самое, но выводим только имена пользователей а алфавитном порядке:
awk -F: '$3 > 999 {print $0}' /etc/passwd | sort
Вывод списка пользователей системы, у которых UID находится в диапазоне от 2 до 500:

awk -F: '($3 >= 2) && ($3 <= 500) {print $1,$3}' /etc/passwd | sort