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) задает строки, которые надо обрабатывать.
Включить вывод 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
awk -F: '($3 >= 2) && ($3 <= 500) {print $1,$3}' /etc/passwd | sort