cut
Извлечение полей или символов из каждой строки файла
Описание
cut — утилита для извлечения частей каждой строки из файла или стандартного ввода. Поддерживает три режима: извлечение по номерам байт (-b), по номерам символов (-c) или по полям с разделителем (-f). Наиболее часто используется последний режим для работы с CSV, TSV и другими файлами с фиксированными разделителями (например /etc/passwd).
Утилита работает построчно: для каждой строки извлекается указанная часть и выводится в stdout. Порядок полей в выводе соответствует их порядку в строке (не порядку их указания в -f): -f3,1 даёт то же, что -f1,3. Если нужно изменить порядок полей, используйте awk.
cut прост и быстр для задач с фиксированным разделителем. Для более сложных задач (несколько разделителей, regex-поля, изменение порядка) используйте awk.
Синтаксис
- Обязателен один из трёх флагов:
-b,-cили-f - Диапазоны:
N— поле N,N-M— поля с N по M,N-— от N до конца,-M— с начала до M - Несколько диапазонов через запятую:
1,3,5-7 - Без файла читает stdin
Флаги и опции
| Флаг | Описание | Пример |
|---|---|---|
-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-
Советы и предупреждения
-d — Tab является разделителем по умолчанию. Просто используйте cut -f2 file.tsv.
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..." или специализированные утилиты.