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; программу пишите в одинарных кавычках.