Learning Platform
Глоссарий Troubleshooting
Урок 08.03 · 18 мин
Начальный
cutCSVFieldsColumnsText processing

Что такое 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...]

Главные опции:

Опции cut

Три способа задать что вырезать.

-f LISTпо полямПоля, разделённые -d. По умолчанию -d = TAB. -f1 — первое, -f1,3 — 1-е и 3-е, -f2- — со 2-го до конца, -f-3 — с начала до 3-го, -f2-5 — диапазон.
-d CHARразделитель полейОдин символ. Кавычки часто нужны для специальных: -d ',' (запятая), -d '|' (пайп), -d $'\\t' (табуляция). По умолчанию — TAB.
-c LISTпо символамcut -c 1-10 — первые 10 символов каждой строки. -c 5- — с 5-го символа до конца. Удобно для fixed-width форматов.
-sпропустить строки без разделителяБез -s строки без разделителя выводятся как есть (для cut -f). С -s они пропускаются — удобно для CSV с заголовком + комментариями.
--output-delimiterдругой sep на выходеПо умолчанию выход с тем же -d. Можно поменять: cut -d ',' -f 1,3 --output-delimiter='|' file -> 'apple|USA'.
--complementвсё КРОМЕ указанных полейcut -d ',' -f 2 --complement file = убрать только 2-ю колонку, оставить остальные.

По полям: -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
SQL SELECT — правильный способ выбрать колонки из табличных данных

Для DE-pipelines, где CSV «грязный» (с quoted commas, escaped chars) — cut не годится. Для чистого простого CSV (логи, IDs, timestamps) — cut быстрее всего.

cut vs awk

Задачаcutawk
Извлечь 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

Попробуй сам

  1. Извлеки имена пользователей из /etc/passwd:
    cut -d ':' -f 1 /etc/passwd
  2. Покажи только home-директории первых 5 system users:
    awk -F':' '$3 < 1000' /etc/passwd | cut -d ':' -f 6 | head -5
  3. Создай CSV и вырежи колонки:
    cat > /tmp/test.csv <<EOF
    name,age,city
    alice,30,Moscow
    bob,25,Berlin
    EOF
    cut -d ',' -f 1,3 /tmp/test.csv
  4. По символам — вырежи 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 — кроссплатформенно.
Проверка знанийKnowledge check
Ты хочешь из логов Nginx 'IP - - [date] "GET /api/users HTTP/1.1" 200 1234' извлечь только статус-код (200) и URL (/api/users). Какая команда правильная: cut или awk, и почему?
ОтветAnswer
awk предпочтительнее. cut проблемы: (1) разделитель пробел, но внутри [date] и "..." есть пробелы, cut посчитает их за delimiters; (2) cut с -d ' ' выведет неправильные поля. awk правильно: awk '{print $9, $7}' — он понимает whitespace как разделитель (одна или несколько space/tab подряд = один separator), извлекает $9 (статус) и $7 (URL). awk также позволяет переставить порядок (cut сохраняет порядок полей в input). Если URL надо без query string: awk '{split($7, a, "?"); print $9, a[1]}'. Альтернатива через cut + tr-обработка пробелов: tr -s ' ' заменит multiple spaces на одиночные — но это не решает проблему пробелов внутри [date]. Правило: для whitespace-separated с variable width — awk. Для clean single-char delimiter (TAB, ',', ':') — cut.

Главное

  • 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.

Проверьте понимание

Результат: 0 из 0
Концептуальный
Вопрос 1 из 4. У тебя строка 'alice:1000:1000:Alice User:/home/alice:/bin/bash'. Какая команда извлечёт username (1-я колонка)?

Закончили урок?

Отметьте его как пройденный, чтобы отслеживать свой прогресс

Войдите чтобы оценить урок

Прогресс модуля
0 из 5