Утилита awk
Описание
awk — это мощный инструмент для манипуляции текстовыми данными, особенно если они организованы в виде строк и столбцов (например, логи, CSV-файлы). Это язык программирования с поддержкой регулярных выражений, условий, циклов, переменных и функций.
Имя
awkпроисходит от фамилий его создателей: Aho, Weinberger и Kernighan.
Синтаксис
awk [опции] 'скрипт' файл(ы)
или
команда | awk [опции] 'скрипт'
Примеры использования
1. Вывести содержимое файла
awk '{ print }' файл.txt
Выведет все строки файла.
2. Вывести определённые столбцы
awk '{ print $1, $3 }' файл.csv
Выведет первый и третий столбец каждой строки.
3. Фильтрация строк по условию
awk '$3 > 100 { print $0 }' данные.txt
Выведет только те строки, где значение в третьем столбце больше 100.
4. Поиск по ключевому слову
awk '/ошибка/ { print }' лог.txt
Выведет все строки, содержащие слово "ошибка".
5. Использование пользовательского разделителя
awk -F ',' '{ print $2 }' файл.csv
Указывает запятую как разделитель полей и выводит второй столбец.
6. Суммирование значений в колонке
awk '{ sum += $1 } END { print sum }' числа.txt
Посчитает сумму всех чисел из первого столбца.
Основные переменные awk
| Переменная | Описание |
|---|---|
$0 |
Вся текущая строка |
$1, $2, ... |
Отдельные поля (столбцы) текущей строки |
NF |
Количество полей в текущей строке |
NR |
Номер текущей строки (всего) |
FNR |
Номер текущей строки в текущем файле |
FS |
Разделитель полей (по умолчанию пробел или табуляция) |
OFS |
Разделитель вывода полей |
ORS |
Разделитель вывода строк |
FILENAME |
Имя текущего файла |
Полезные примеры
1. Вывести количество строк в файле
awk 'END { print NR }' файл.txt
2. Вывести заголовок и данные
awk 'NR == 1 { print "Заголовок:", $0 } NR > 1 { print "Строка", NR-1, ":", $0 }' файл.csv
3. Группировка и подсчёт
awk '{ count[$1]++ } END { for (key in count) print key, count[key] }' логи.txt
Подсчитывает, сколько раз встречается каждое значение в первом столбце.
Условия и операторы
awk поддерживает:
- Условия: if, else if, else
- Циклы: for, while, do while
- Логические операторы: &&, ||, !
- Регулярные выражения: /pattern/, $1 ~ /pattern/, $1 !~ /pattern/
Пример:
awk '{ if ($3 > 90) print $1, "отличник"; else print $1, "не прошёл" }' оценки.txt
Функции awk
awk имеет встроенные функции:
| Группа | Примеры |
|---|---|
| Математика | sqrt(x), rand(), int(x) |
| Работа со строками | length(s), substr(s, i, n), index(s, t) |
| Разделение строк | split(s, arr, sep) |
| Регулярные выражения | match(s, r), sub(r, t, s), gsub(r, t, s) |
Пример:
awk '{ print substr($1, 1, 3) }' файл.txt
Выводит первые три символа из первого столбца.
Альтернативы
| Инструмент | Когда использовать |
|---|---|
sed |
Для потоковой обработки и замены текста |
cut |
Если нужно просто вырезать столбцы |
grep |
Для поиска строк по шаблону |
perl / python |
Для сложной обработки текста |
datamash |
Для статистики и математических операций над данными |
Пример работы
Создадим тестовый файл данные.txt:
echo -e "Иван 85\nОльга 95\nПетр 70" > данные.txt
Посчитаем средний балл:
awk '{ sum += $2; count++ } END { print "Средний балл:", sum/count }' данные.txt
Результат:
Средний балл: 83.3333
Полезные ссылки
- Официальная документация GNU Awk: https://www.gnu.org/software/gawk/manual/gawk.html
- Онлайн-туториалы:
- awk.one
- Grymoire Awk Tutorial