open atlas
↑ К треку
Командная строка CLI · 06 · 01

cut и поля

cut вырезает колонки из разделённого текста. -d задаёт разделитель, -f выбирает поля по номеру или диапазону, -c режет по позиции символа. Вместе они заменяют полноценный парсер для простых структурированных логов и TSV-файлов.

CLI Middle ◷ 20 min
Уровень
ОсновыJuniorMiddleSenior

Каждая система производит структурированный текст — логи доступа, /etc/passwd, CSV-экспорты, TSV-дампы из баз данных. Нужные тебе колонки спрятаны внутри строк, которые в основном не нужны. cut — самый быстрый способ извлечь одну колонку из потока: один флаг для разделителя, один для номера поля — и готово. Он не парсит кавычки, не обрабатывает экранированные разделители и не понимает заголовки — но для большинства машинно-генерируемых данных этого достаточно. Когда нужна колонка 3 из файла, разделённого двоеточиями, cut -d: -f3 — это десять символов и ноль зависимостей.

К концу урока ты сможешь нарезать любой текст с единственным разделителем по номеру поля, диапазону полей и позиции символа.

Цель

После этого урока ты сможешь использовать cut -d РАЗД -f N для извлечения поля N из ввода с разделителями, использовать -f N-M и -f N,M для диапазонов и списков, использовать -c для позиционных вырезов по символам и встраивать cut в конвейер для очистки структурированного вывода логов.

1

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-ввод (разделение табуляцией).

2

-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-колонку и оставляет всё остальное.

3

-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 вырезает её точно без какой-либо логики разделителей.

4

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 разбивает на пробел, чтобы выделить только номер порта. Двухэтапные вырезы распространены для хитрых форматов.

5

Ловушка: 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

Пошагово:

  1. cut -d: -f7 /etc/passwd — извлечь поле 7 (оболочку) из каждой строки.
  2. sort — сгруппировать одинаковые оболочки рядом (необходимо перед uniq).
  3. uniq -c — подсчитать последовательные одинаковые строки, выводя количество оболочка.
  4. 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-уровень. Открой, попробуй, потом открой ответ.

вспомнитьприменитьуглубить0 из 4 завершено

Что-то непонятно?

Задай вопрос по этому уроку. Вопросы анонимны и попадают напрямую автору — урок станет лучше.

хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources2
expand
  1. 01
  2. 02

Trademarks belong to their respective owners. Editorial reference only.