Что такое cut
cut — простейшая утилита для извлечения фрагментов строк: либо по полям (с разделителем), либо по позициям символов. Не делает вычислений, не агрегирует — просто «вырежи кусок каждой строки».
$ cat fruits.csv
apple,10,USA
banana,5,Ecuador
cherry,20,Turkey
$ cut -d ',' -f 1 fruits.csv
apple
banana
cherry
$ cut -d ',' -f 1,3 fruits.csv
apple,USA
banana,Ecuador
cherry,Turkey
Это эквивалент SQL SELECT col1 FROM .... Для DE — основной инструмент быстро выдернуть колонку из CSV.
Синтаксис
cut OPTIONS [FILE...]
Главные опции:
Три способа задать что вырезать.
По полям: -d -f
$ cat /etc/passwd | head -3
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
# Только имена пользователей
$ cut -d ':' -f 1 /etc/passwd | head -3
root
daemon
bin
# Имя, UID, и shell
$ cut -d ':' -f 1,3,7 /etc/passwd | head -3
root:0:/bin/bash
daemon:1:/usr/sbin/nologin
bin:2:/usr/sbin/nologin
Делать cut -d ':' -f 1 /etc/passwd намного эффективнее, чем awk -F':' '{print $1}' для простых задач — cut реализован в C без regex/parser overhead. На лог-файлах в гигабайты разница заметна.
Диапазоны полей
cut -f 1 # только первое поле
cut -f 1,3 # первое и третье
cut -f 1-3 # 1, 2 и 3
cut -f 2- # со 2-го до конца
cut -f -3 # с начала до 3-го
cut -f 2-5,8 # 2-5 и 8
По символам: -c
# Первые 10 символов каждой строки
$ cut -c 1-10 /var/log/syslog
2026-05-13
# Символы 12-20 (часть после даты в syslog)
$ cut -c 12-20 /var/log/syslog
12:34:56
Полезно для fixed-width форматов: timestamps ISO 8601 всегда YYYY-MM-DD HH:MM:SS — 19 символов. Можно вырезать дату без regex:
# Извлечь только дату из лога
$ cut -c 1-10 app.log | sort -u
2026-05-13
2026-05-14
DE-кейсы
1. Извлечение колонок из CSV
$ cat orders.csv
order_id,customer_id,amount,country
1001,42,150,USA
1002,17,89,France
1003,42,230,USA
# Только amount
$ cut -d ',' -f 3 orders.csv
amount
150
89
230
# Без заголовка (skip first line)
$ tail -n +2 orders.csv | cut -d ',' -f 3
150
89
230
tail -n +2 — start from line 2 (skip header).
2. /etc/passwd -> список shells
$ cut -d ':' -f 7 /etc/passwd | sort | uniq -c | sort -rn
17 /usr/sbin/nologin
2 /bin/false
1 /bin/sync
1 /bin/bash
3. Уникальные домены email
$ cut -d '@' -f 2 contacts.txt | sort -u
example.com
gmail.com
yahoo.com
4. Логи Nginx — только URL
# Combined log format: IP - - [date] "METHOD URL HTTP/1.1" status size ...
$ awk '{print $7}' access.log | head
/api/orders
/api/products?id=42
/static/css/main.css
Здесь awk уместнее cut: разделитель сложный (пробел внутри [date]), и нужен 7-й whitespace-separated field. cut с -d ' ' посчитает несколько space за разные delimiters.
Ограничения cut: quoted CSV
cut не понимает кавычки в CSV. Это его главное ограничение:
$ cat tricky.csv
name,description,price
"Apple, Red",Fresh fruit,2.50
"Banana, Yellow","Tropical, sweet",1.20
$ cut -d ',' -f 2 tricky.csv
description
Red"
Yellow"
Запятая внутри quotes "Apple, Red" сломала parsing — cut не знает, что quote открывает literal-секцию.
Когда нужен честный CSV-parsing — используй:
- awk с правильным regex (сложно)
- csvkit:
apt install csvkit->csvcut -c 2 tricky.csv(правильно учитывает quotes) - xsv или csvq — современные Rust-инструменты
- duckdb для SQL поверх CSV:
duckdb -c "SELECT col2 FROM 'tricky.csv'" - Python pandas / pyarrow
Для DE-pipelines, где CSV «грязный» (с quoted commas, escaped chars) — cut не годится. Для чистого простого CSV (логи, IDs, timestamps) — cut быстрее всего.
cut vs awk
| Задача | cut | awk |
|---|---|---|
| Извлечь N-ю колонку из простого CSV | [x] оптимально | избыточно |
| Несколько колонок | [x] | [x] |
| Колонки в произвольном порядке (3,1,2) | НЕТ — cut сохраняет порядок | [x] |
| Whitespace-separated с переменным числом пробелов | плохо | [x] |
| Quote-aware CSV | НЕТ | сложно |
| Условная фильтрация (only rows where col3 > 100) | НЕТ | [x] |
| Скорость на простых задачах | быстрее (нет regex/parsing) | медленнее |
# Эти команды дают разный результат!
$ cut -d ',' -f 3,1 data.csv # выведет col1,col3 (cut НЕ переставляет)
$ awk -F',' '{print $3","$1}' # выведет col3,col1
Это часто удивляет: cut не переупорядочивает колонки — выводит в порядке исходных полей.
Pipeline tricks
# Замена разделителя через cut + paste
$ echo "1,2,3,4" | cut -d ',' -f 1,3 --output-delimiter='|'
1|3
# Колонка + добавление префикса
$ cut -d ',' -f 1 users.csv | sed 's/^/user_/'
user_alice
user_bob
# Подсчёт уникальных значений в колонке (sort | uniq -c)
$ cut -d ',' -f 4 orders.csv | sort | uniq -c | sort -rn
1247 USA
893 France
412 Germany
Попробуй сам
- Извлеки имена пользователей из /etc/passwd:
cut -d ':' -f 1 /etc/passwd - Покажи только home-директории первых 5 system users:
awk -F':' '$3 < 1000' /etc/passwd | cut -d ':' -f 6 | head -5 - Создай CSV и вырежи колонки:
cat > /tmp/test.csv <<EOF name,age,city alice,30,Moscow bob,25,Berlin EOF cut -d ',' -f 1,3 /tmp/test.csv - По символам — вырежи timestamp из логов:
echo "2026-05-13T12:34:56 INFO starting" | cut -c 1-19
macOS-различия
- BSD cut на macOS не имеет
--complementи--output-delimiter. Для них установи GNU coreutils:brew install coreutils->gcutс теми же опциями что в Linux. - Базовые
-d,-f,-c,-sработают идентично. csvkitчерезpip install csvkit— кроссплатформенно.
Главное
cut -d ',' -f 1,3 file— извлечение колонок по разделителю.cut -c 1-10 file— по символьным позициям (fixed-width).-f 2-(от 2 до конца),-f -3(от начала до 3),-f 1-5,8(диапазон + один).cutне понимает кавычки в CSV — для quoted CSV используйcsvkit,xsv,duckdbилиawkс правильным parsing.cutне переупорядочивает колонки — выводит в порядке input.- Cut быстрее awk на простых extraction-задачах (нет regex/parser overhead).
- Для whitespace-separated с variable width —
awk, неcut.