linux streams

cut

Извлечение полей или символов из каждой строки файла

Описание

cut — утилита для извлечения частей каждой строки из файла или стандартного ввода. Поддерживает три режима: извлечение по номерам байт (-b), по номерам символов (-c) или по полям с разделителем (-f). Наиболее часто используется последний режим для работы с CSV, TSV и другими файлами с фиксированными разделителями (например /etc/passwd).

Утилита работает построчно: для каждой строки извлекается указанная часть и выводится в stdout. Порядок полей в выводе соответствует их порядку в строке (не порядку их указания в -f): -f3,1 даёт то же, что -f1,3. Если нужно изменить порядок полей, используйте awk.

cut прост и быстр для задач с фиксированным разделителем. Для более сложных задач (несколько разделителей, regex-поля, изменение порядка) используйте awk.

Синтаксис

cut OPTION... [FILE]...
# Первое поле /etc/passwd (разделитель ':') cut -d: -f1 /etc/passwd # Первые 10 символов каждой строки cut -c1-10 file.txt # Поля 1 и 3 из CSV cut -d',' -f1,3 data.csv # От 5-го символа до конца строки cut -c5- file.txt

Флаги и опции

Флаг Описание Пример
-f LIST Извлечь поля по номерам (нумерация с 1), требует -d cut -d: -f1,3 /etc/passwd
-d DELIM Разделитель полей (по умолчанию Tab) cut -d',' -f2 data.csv
-c LIST Извлечь символы по позициям cut -c1-8 file.txt
-b LIST Извлечь байты по позициям (для бинарных данных) cut -b1-4 binary.dat
--complement Инвертировать выборку — вывести всё кроме указанного cut -d: --complement -f1 /etc/passwd
-s Не выводить строки без разделителя (только в режиме -f) cut -d: -f1 -s file.txt
--output-delimiter=STR Использовать STR как разделитель в выводе (GNU cut) cut -d: -f1,3 --output-delimiter=' | ' /etc/passwd

Формат LIST для диапазонов: N, N-M, N-, -M, N,M,K

Паттерны использования

Работа с /etc/passwd

# Имена пользователей
cut -d: -f1 /etc/passwd

# Имя и домашний каталог (поля 1 и 6)
cut -d: -f1,6 /etc/passwd

# Все кроме пароля (поле 2)
cut -d: --complement -f2 /etc/passwd

Обработка CSV

# Извлечь второй столбец
cut -d',' -f2 data.csv

# Несколько столбцов
cut -d',' -f1,3,5 report.csv

# Пропустить заголовок
tail -n +2 data.csv | cut -d',' -f1

Извлечение по позиции символа

# Первые 8 символов (дата в логе)
cut -c1-8 access.log

# Символы с 10-го до конца
cut -c10- log.txt

# Конкретные символы
cut -c1,5,10 data.txt

Извлечение из вывода команд

# Username из вывода who
who | cut -d' ' -f1

# Первое слово каждой строки
echo "hello world" | cut -d' ' -f1

# IP из лога nginx
cut -d' ' -f1 access.log | sort | uniq -c

Работа с TSV (табуляция)

# По умолчанию разделитель — Tab
cut -f2 data.tsv
cut -f1,3 table.tsv

# Явно указать таб
cut -d$'\t' -f2 data.tsv

Комбинирование с другими командами

cut -d: -f1 /etc/passwd | sort | head -5
grep "Failed" auth.log | cut -d' ' -f11
df | tail -n+2 | cut -c55-

Советы и предупреждения

Совет: Для TSV-файлов (разделитель Tab) не нужно указывать -d — Tab является разделителем по умолчанию. Просто используйте cut -f2 file.tsv.
Совет: Если нужно изменить порядок полей, использовать разные разделители для ввода и вывода или применить regex — переключайтесь на awk: awk -F: '{print $3, $1}' /etc/passwd — поля 3 и 1 в изменённом порядке.
Совет: Флаг --output-delimiter (GNU cut) позволяет изменить разделитель в выводе: cut -d: -f1,6 --output-delimiter=' -> ' /etc/passwd
Внимание: cut -f3,1 выведет поля в порядке 1, 3 — не 3, 1. Нумерация полей определяет их положение в строке, а не порядок вывода. Для изменения порядка используйте awk.
Внимание: cut не обрабатывает экранированные разделители или разделители в кавычках (как в настоящем CSV). Для правильного парсинга CSV используйте python -c "import csv..." или специализированные утилиты.