С чего начать Первые шаги трек · 15 ступеней
Linux Labs

cut — вырезать колонки из строк

5 мин Ubuntu 24.04 · GNU coreutils 9.4

Команда cut вырезает из каждой строки колонки по разделителю (-d и -f) или символы по номерам позиций (-c).

Шпаргалка

7 команд Версия для печати
  • cut -d: -f1 /etc/passwd первая колонка, разделитель «:»
  • cut -d: -f1,7 /etc/passwd колонки 1 и 7
  • cut -d, -f2- data.csv со 2-й до конца строки
  • cut -d' ' -f1 access.log первое слово строки
  • cut -c1-8 file.txt символы с 1-го по 8-й
  • cut -f2 table.tsv 2-я колонка, разделитель TAB
  • cut -d: -f1,6 --output-delimiter=' ' /etc/passwd

Обзор

cut делит каждую строку на колонки по одному символу-разделителю и печатает те, номера которых указаны в -f. Разделитель задаёт -d, без него — табуляция. Колонки считаются с единицы:

text
student@ubuntu:~$ head -n 2 /etc/passwd | cut -d: -f1,7
root:/bin/bash
daemon:/usr/sbin/nologin

Между выбранными колонками cut ставит тот же разделитель. Номера пишут списком (1,3) и диапазоном (2-4, 3- — до конца строки). Вместо колонок можно резать по позициям: -c — символы, -b — байты. В Ubuntu -c тоже считает байты: для латиницы разницы нет, кириллицу он режет пополам.

cut понимает только одиночный разделитель. Два пробела подряд для него — пустая колонка между ними. Текст, выровненный пробелами (вывод ps, df, uniq -c), режут через awk '{print $2}' — см. sed и awk.

Ключи

7

-f, -c и -b — три способа выбрать кусок строки; в одном вызове нужен ровно один. Полный список — man cut.

Ключ Что делает Пример
-d --delimiter C Разделитель колонок — один символ; без ключа — табуляция. cut -d: -f1 /etc/passwd
-f --fields LIST Какие колонки печатать — 1,3 или 2-4 или 3-. cut -d, -f2- data.csv
-c --characters LIST Резать по позициям; в Ubuntu считает байты, как -b. cut -c1-8 file.txt
-s --only-delimited Пропускать строки, в которых нет разделителя. cut -s -d= -f2 settings.conf
--complement Печатать всё, кроме выбранных колонок. cut -d: --complement -f2 /etc/passwd
--output-delimiter STR Чем соединять колонки в выводе вместо разделителя ввода. cut -d: -f1,7 --output-delimiter=' ' /etc/passwd
-b --bytes LIST Резать по номерам байтов. cut -b1-4 data.bin

Ничего не найдено. Попробуй запрос короче.

Рецепты

5

Имена пользователей и их оболочки

bash
cut -d: -f1 /etc/passwd             # все учётные записи
cut -d: -f1,7 /etc/passwd | grep -v nologin

Адреса из журнала веб-сервера

bash
cut -d' ' -f1 /var/log/nginx/access.log |
  sort | uniq -c | sort -rn | head

Первое слово строки журнала nginx — адрес клиента. Дальше sort и uniq считают, кто приходил чаще.

Колонка из CSV

bash
cut -d, -f3 data.csv | sort -u      # разные значения 3-й колонки
cut -d, -f1,3 --output-delimiter=$'\t' data.csv

Если в значениях CSV встречаются запятые в кавычках, cut их не поймёт: нужна программа, знающая формат.

Всё, кроме одной колонки

bash
cut -d: --complement -f2 /etc/passwd    # без поля пароля

Пропустить строки без разделителя

bash
cut -s -d= -f2 settings.conf     # только строки вида ключ=значение

Без -s строка без разделителя печатается целиком.

Неполадки

7

Пустой вывод при разделителе-пробеле

Между словами больше одного пробела, и нужная колонка пустая. Схлопни пробелы через tr -s ' ' перед cut или возьми колонку awk '{print $2}'.

cut печатает всю строку

В строке нет разделителя из -d, и cut выводит её как есть. Проверь разделитель (: или ,, табуляция или пробел) или добавь -s, чтобы такие строки пропускать.

cut: you must specify a list of bytes, characters, or fields

Не указано, что вырезать. Добавь -f с номерами колонок или -c с позициями.

cut: the delimiter must be a single character

После -d стоит больше одного символа. cut понимает один символ; для разделителя из нескольких символов бери awk -F.

cut: fields are numbered from 1

Колонки нумеруются с единицы: первая — -f1, а не -f0.

cut: only one type of list may be specified

В одной команде и -f, и -c. Оставь один способ.

Русские буквы разрезаны пополам

cut -c в Ubuntu считает байты, как -b, а русская буква в UTF-8 занимает два байта. Для текста не на латинице режь по колонкам (-d, -f) или через awk.

См. также

  • sort — упорядочить вырезанную колонку.
  • uniq — посчитать повторы в колонке.
  • wc — сколько строк получилось.
  • sed-awk — awk режет по любому числу пробелов и считает.
  • redirection — как собрать команды в конвейер.
  • text-tools — tr, paste, column и другие звенья конвейера.
Загрузка…