cut и поля
cut вырезает колонки из разделённого текста. -d задаёт разделитель, -f выбирает поля по номеру или диапазону, -c режет по позиции символа. Вместе они заменяют полноценный парсер для простых структурированных логов и TSV-файлов.
Каждая система производит структурированный текст — логи доступа, /etc/passwd, CSV-экспорты, TSV-дампы из баз данных. Нужные тебе колонки спрятаны внутри строк, которые в основном не нужны. cut — самый быстрый способ извлечь одну колонку из потока: один флаг для разделителя, один для номера поля — и готово. Он не парсит кавычки, не обрабатывает экранированные разделители и не понимает заголовки — но для большинства машинно-генерируемых данных этого достаточно. Когда нужна колонка 3 из файла, разделённого двоеточиями, cut -d: -f3 — это десять символов и ноль зависимостей.
К концу урока ты сможешь нарезать любой текст с единственным разделителем по номеру поля, диапазону полей и позиции символа.
После этого урока ты сможешь использовать cut -d РАЗД -f N для извлечения поля N из ввода с разделителями, использовать -f N-M и -f N,M для диапазонов и списков, использовать -c для позиционных вырезов по символам и встраивать cut в конвейер для очистки структурированного вывода логов.
cut -d РАЗД -f N извлекает поле N, считая с 1. Флаг -d задаёт входной разделитель (один символ); -f указывает номер поля. Если разделитель — двоеточие, поле 1 — всё до первого двоеточия, поле 2 — между первым и вторым двоеточием, и так далее.
echo "root:x:0:0:root:/root:/bin/bash" | cut -d: -f1Вывод: root
echo "root:x:0:0:root:/root:/bin/bash" | cut -d: -f7Вывод: /bin/bash
Разделитель по умолчанию — символ табуляции. Без -d cut ожидает TSV-ввод (разделение табуляцией).
-f N-M выбирает непрерывный диапазон; -f N,M выбирает список. Обе формы можно комбинировать.
cut -d: -f1,7 /etc/passwdВыводит имя пользователя (поле 1) и оболочку (поле 7) для каждой строки — два поля, перечисленные через запятую в аргументе -f, без разделителя между ними в выводе (используется исходный разделитель).
cut -d: -f1-3 /etc/passwdПоля с 1 по 3: имя пользователя, заглушка пароля, UID.
Открытые диапазоны: -f3- означает «поле 3 до конца строки». -f-3 означает «поля 1 через 3». Удобно, когда не знаешь точно, сколько полей в строке.
cut -d, -f2- data.csvУдаляет первую CSV-колонку и оставляет всё остальное.
-c режет по позиции символа, а не по разделителю. Это правильный инструмент для форматов с фиксированной шириной — временны́е метки логов, колоночные отчёты, где поля всегда одинаковой ширины.
date
# Thu Jun 19 14:32:07 UTC 2025
date | cut -c1-3
# Thu-c1-3 оставляет символы 1, 2 и 3 — только аббревиатуру дня. Применяется тот же синтаксис диапазонов: -c5-7 для позиций 5–7, -c1,5 для позиций 1 и 5.
Для строк syslog с фиксированной шириной временна́я метка всегда одной ширины, поэтому -c вырезает её точно без какой-либо логики разделителей.
cut в конвейере: объединение с sort, uniq и grep. cut читает из stdin, если файл не указан, поэтому он естественно встраивается в любую стадию конвейера.
cat /etc/passwd | cut -d: -f1 | sortВсе имена пользователей, отсортированные по алфавиту.
getent passwd | cut -d: -f7 | sort -uКаждая уникальная оболочка, настроенная в системе. -u в sort удаляет дубликаты (аналог sort | uniq).
ss -tlnp | grep LISTEN | cut -d: -f2 | cut -d' ' -f1Номера портов всех TCP-слушателей. Первый cut разбивает на :, чтобы получить часть адрес:порт; второй cut разбивает на пробел, чтобы выделить только номер порта. Двухэтапные вырезы распространены для хитрых форматов.
Ловушка: cut не понимает кавычки и экранирование. Если CSV-поле содержит запятую внутри двойных кавычек — "Smith, John" — cut -d, -f2 разобьёт по запятой внутри кавычек и даст неверный ответ. Для правильного разбора CSV используй awk, python -c или специальный инструмент вроде csvkit. cut надёжен для машинно-генерируемых данных, где разделитель никогда не встречается внутри значений полей.
echo '"Smith, John",alice,30' | cut -d, -f1
# "SmithВывод неверный — разбился внутри поля в кавычках. Знай свои данные, прежде чем тянуться к cut.
Извлечь уникальные оболочки из /etc/passwd и подсчитать, сколько пользователей используют каждую.
cut -d: -f7 /etc/passwd | sort | uniq -c | sort -rnПошагово:
cut -d: -f7 /etc/passwd— извлечь поле 7 (оболочку) из каждой строки.sort— сгруппировать одинаковые оболочки рядом (необходимо передuniq).uniq -c— подсчитать последовательные одинаковые строки, выводяколичество оболочка.sort -rn— отсортировать численно в обратном порядке, чтобы самая распространённая оболочка была первой.
Пример вывода на типичном сервере:
42 /usr/sbin/nologin
8 /bin/bash
3 /bin/sh
1 /bin/syncЭтот конвейер отвечает на вопрос «какие оболочки используются и сколько у каждой пользователей?» одной составной командой — без написания скриптов.
▸Почему это работает
На macOS и других BSD поведение cut идентично GNU cut для флагов, рассмотренных здесь (-d, -f, -c). Отличие: BSD cut не поддерживает --output-delimiter (расширение GNU, меняющее выходной разделитель при выводе нескольких полей). Если нужен другой выходной разделитель, используй awk -F: '{print $1 "\t" $7}' — это работает на обеих платформах.
▸Частая ошибка
Распространённая ошибка — забыть, что cut -f считает с 1, а не с 0. Поле 1 — это первая колонка. cut -f0 даёт ошибку в GNU cut и тихо выдаёт пустой вывод в некоторых BSD-версиях. Ещё одна ловушка: cut выводит поля в порядке их появления во входной строке, а не в порядке перечисления в -f. cut -d: -f7,1 выведет поле 1, затем поле 7 — так же, как -f1,7. Чтобы переупорядочить поля, используй awk '{print $7, $1}'.
Ты запускаешь: echo 'a:b:c:d:e' | cut -d: -f2-4. Каков вывод?
cut извлекает колонки из текста с разделителями. -d РАЗД задаёт разделитель полей (по умолчанию табуляция); -f N выбирает поле, -f N-M — диапазон, -f N,M — список. -c режет по позиции символа для форматов с фиксированной шириной. cut не обрабатывает кавычки и разделители внутри полей — используй его для машинно-генерируемых данных, где разделитель никогда не встречается внутри значений. В конвейере cut встраивается между производителем и инструментами ниже по потоку вроде sort и uniq, чтобы извлечь именно нужную колонку перед подсчётом или дедупликацией.
Практика
Начни сверху. Задачи идут от простого к сложному: вспомнить факт, применить к случаю, затем senior-уровень. Открой, попробуй, потом открой ответ.
Что-то непонятно?
Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.