awk и cut: работа с колонками

Извлекаем и обрабатываем данные из колонок и таблиц.

awk — это мини-язык обработки текста по колонкам, где каждая строка разбивается на поля $1, $2 и так далее.

cut: быстро вырезать колонку

Если данные разделены символом, cut вытащит нужные поля. Опция -d задаёт разделитель, -f — номера полей.

echo "alice:1001:/home/alice" | cut -d: -f1
cut -d, -f2,3 data.csv

Вывод:

alice

Первая команда взяла первое поле, разделённое двоеточием. cut прост и быстр, но умеет только вырезать.

awk: колонки плюс логика

awk мощнее: он разбивает строку на поля (по умолчанию по пробелам) и позволяет писать условия и вычисления. Поля — $1, $2, вся строка — $0, число полей — NF.

echo "Иван 85 90" | awk '{print $1, ($2 + $3) / 2}'

Вывод:

Иван 87.5

awk взял имя из $1 и посчитал среднее из двух оценок. Обратите внимание: awk умеет дробную арифметику, в отличие от $((...)).

Фильтрация и свой разделитель

awk -F: '$3 >= 1000 {print $1}' /etc/passwd
df -h | awk '$5+0 > 80 {print $6, $5}'

Первая команда (-F: — разделитель двоеточие) печатает имена пользователей с UID от 1000. Вторая берёт вывод df и печатает разделы, заполненные больше чем на 80% — основа скрипта мониторинга диска.

Как работает под капотом

awk работает по принципу «шаблон { действие }»: для каждой строки он проверяет шаблон (условие) и, если тот истинен, выполняет действие в скобках. Если шаблон опущен — действие для каждой строки; если опущено действие — печать совпавших строк. Перед строками выполняется блок BEGIN{}, после — END{} (удобно для итогов и сумм). Поля пересчитываются для каждой строки заново по разделителю FS.

Частые ошибки

  • cut для пробелов переменной ширины. cut с -d' ' считает каждый пробел разделителем; для колонок, выровненных множеством пробелов, лучше awk (он схлопывает пробелы).
  • Сравнение строки и числа в awk. Добавьте +0 ($5+0 > 80), чтобы заставить awk считать поле числом, если в нём есть символы вроде %.
  • Кавычки. Программу awk берите в одинарные кавычки, иначе Bash подставит $1 как свой аргумент.

Итог

  • cut -d РАЗДЕЛИТЕЛЬ -f ПОЛЯ — простое вырезание колонок.
  • awk разбивает строку на поля $1, $2; $0 — вся строка, NF — число полей, -F задаёт разделитель.
  • awk поддерживает условия, дробную арифметику и блоки BEGIN/END; программу пишите в одинарных кавычках.
Проверьте себя
1. Что в awk обозначает $2?
AВторую строку файла
BВторое поле (колонку) текущей строки
CПеременную с именем 2
DВторой аргумент скрипта
2. Как в cut задать разделитель полей — двоеточие?
Acut -s:
Bcut -d: -f...
Ccut --sep=:
Dcut -F:
3. В чём преимущество awk перед арифметикой $((...))?
Aawk работает только с целыми
Bawk умеет дробную арифметику, например среднее
Cawk быстрее всегда
DРазницы нет