✂️ cut: кратко и по делу#

cut — утилита для вырезания колонок/диапазонов из строк: по позициям, байтам или полям с заданным разделителем.
Идеальна для быстрого извлечения столбцов из CSV/TSV/логов и подготовки данных к sort, uniq, awk, jq и т.д.


📝 Топ‑20 ключевых флагов и приёмов cut (GNU coreutils)#

  • -d <delim> — задать разделитель полей (по умолчанию таб).
  • -f <list> — выбрать поля (напр., 1,3, 2-5, 1,4-, -3).
  • -sпропускать строки без разделителя (иначе выводятся как есть).
  • --output-delimiter=<str> — изменить разделитель вывода.
  • -b <list> — выбрать байты по позициям/диапазонам.
  • -c <list> — выбрать символы по позициям/диапазонам.
  • Поддержка диапазонов: N- (от N до конца), -N (от начала до N), N-M.
  • --complementинвертировать выбор (взять всё кроме указанных).
  • --help, --version — справка и версия.
  • Работает со stdin: ... | cut ... и множеством файлов.

⚠️ -b/-c чувствительны к кодировке: для UTF‑8 «символ» может занимать несколько байт. Предпочитай -f с разделителем для табличных данных.


🚀 Айсберг команд cut — от базового к гуру#

🟢 Уровень 1 — База (разогрев)#

cut -d, -f1 file.csv

  • Первый столбец CSV

cut -d, -f1,3 file.csv

  • Первый и третий столбцы

cut -d; -f2-4 data.txt

  • Поля 2..4 с разделителем ;

cut -f1,4 file.tsv

  • Вкладки по умолчанию: взять поля 1 и 4

cut -d" " -f1 access.log

  • Первый «столбец» из логов (IP)

🟡 Уровень 2 — Диапазоны и гибкость#

cut -d, -f2- file.csv

  • Со второго столбца до конца

cut -d, -f-3 file.csv

  • От начала до третьего

cut -d, -f1,3-5 file.csv

  • Набор + диапазон

cut -d: -f1 /etc/passwd

  • Логины пользователей

cut -d: -f1,6 /etc/passwd

  • Логин и домашний каталог

🟠 Уровень 3 — Байты и символы#

echo "abcdef" | cut -b 1-3

  • Первые 3 байта

echo "abcdef" | cut -c 2-5

  • Символы 2..5

printf "привет\n" | cut -b 1-4

  • Демонстрация проблем с UTF‑8 (режет байты)

printf "привет\n" | cut -c 1-3

  • Режем символы (корректнее для UTF‑8)

cut -c -10 long_lines.txt

  • Первые 10 символов каждой строки

🔵 Уровень 4 — Фильтрация строк и вывод#

cut -d, -f2 -s file.csv

  • Пропустить строки без запятых

cut -d, -f1-3 --output-delimiter=" | " file.csv

  • Сменить разделитель в выводе

cut -d, -f1,3 --complement file.csv

  • Взять все, кроме полей 1 и 3

cut -d" " -f1,9 access.log | column -t

  • Красивый выровненный вывод

cut -d, -f1-3 file.csv > first3.csv

  • Сохранить результат в файл

🟣 Уровень 5 — Интеграция с сортировкой и анализом#

cut -d, -f3 prices.csv | sort -n | uniq -c | sort -nr | head

  • Топ цен из 3‑го столбца

cut -d, -f2 users.csv | sort | uniq

  • Уникальные значения 2‑го столбца

grep ERROR app.log | cut -d" " -f4- | sort | uniq -c | sort -nr | head

  • Топ ошибок по сообщению

awk -F, '{print $2,$3}' file.csv | cut -d" " -f1

  • Очистка лишних пробелов после awk

cut -d, -f1 file.csv | paste -sd, -

  • Собрать значения в одну строку через запятую

🔴 Уровень 6 — Гуру‑режим и CSV‑подводные камни#

cut -d, -f2 "a,\"b,b\",c"

  • ⚠️ cut не понимает кавычки внутри CSV — поле «сломается». Используйте csvtool, mlr, xsv или awk с парсером CSV.

mlr --icsv --ocsv cut -f 2 file.csv

  • Корректный «cut» для CSV через Miller

python -c 'import csv,sys;print(",".join(next(csv.reader(sys.stdin))[1:3]))' < file.csv

  • Мини‑парсер CSV на Python для сложных случаев

cut -d, -f2- --output-delimiter=$'\t' file.csv

  • Преобразовать CSV → TSV

🟤 Уровень 7 — Автоматизация и one‑liners#

find logs -type f -name "*.log" -exec cat {} + | cut -d" " -f1 | sort | uniq -c | sort -nr | head

  • Топ IP из всех логов

journalctl -u nginx | cut -d" " -f1-3,10-

  • Вырезать timestamp и сообщение

ps aux | cut -c 1-8,43-

  • Вырезать фиксированные позиции столбцов

git log --pretty=oneline | cut -d" " -f1 | head

  • Список коротких SHA коммитов

ss -tuna | cut -d" " -f1- | tr -s " " | cut -d" " -f1,5

  • IP:порт из ss с нормализацией пробелов

🧩 Бонус — практические сценарии#

Достать домены из URL‑ов:

cut -d/ -f3 urls.txt | sort | uniq -c | sort -nr

Получить список PID c CPU>80%:

ps aux | awk '$3>80 {print $2,$3}' | cut -d" " -f1

Список пользователей и их домашние каталоги:

cut -d: -f1,6 /etc/passwd

Собрать email‑ы в одну строку через запятую:

cut -d, -f2 emails.csv | paste -sd, -

Вырезать первые 20 символов из каждой строки:

cut -c 1-20 file.txt