Table of Contents
✂️ 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