Утилита 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