Cut start

Материал из ALT Linux Wiki

Многие слышали про команду cut - для обрезки команд.

Но, лично я за 14 лет пользования Linux так и не понял ее синтаксис / как пользоваться. Странички, объясняющей, как это делать на нашей вики я не нашел, поэтому попробую написать сам.

Help

-f, --fields=СПИСОК	Выбрать поля (колонки), указанные в СПИСОК. Это опция по умолчанию для полей, разделенных символом табуляции.
-d, --delimiter=РАЗДЕЛИТЕЛЬ	Использовать указанный РАЗДЕЛИТЕЛЬ вместо табуляции (для опции -f).
-c, --characters=СПИСОК	Выбрать только символы, указанные в СПИСОК.
-b, --bytes=СПИСОК	Выбрать только байты, указанные в СПИСОК.
--complement	Инвертировать выбор (взять всё, кроме указанных полей/символов/байтов).
-s, --only-delimited	Не выводить строки, в которых нет разделителя (работает с -f).
--output-delimiter=СТРОКА	Использовать СТРОКА в качестве выходного разделителя. По умолчанию используется исходный разделитель.

Формат СПИСОК

СПИСОК — это перечень номеров, который может быть представлен в нескольких форматах:

  • Одно число: 3 (только третье поле/символ)
  • Диапазон: 3-5 (с третьего по пятое включительно)
  • Несколько элементов через запятую: 1,3,5 (первое, третье и пятое)
  • Комбинация диапазонов: 1,3-5,7
  • От начала до N: -5 (с первого по пятое)
  • От N до конца: 5- (с пятого до конца строки)

Примеры использования

Примеры использования

Предположим, у нас есть файл data.txt с таким содержимым:

id:name:age:city
1:Alice:30:New York
2:Bob:25:London
3:Charlie:35:Tokyo

Работа с полями (-f)

Пример 1: Выбрать одно поле (например, только имена)
cut -d ':' -f 2 data.txt

Результат:

name
Alice
Bob
Charlie
Пример 2: Выбрать несколько полей (имя и город)
cut -d ':' -f 2,4 data.txt

Результат:

name:city
Alice:New York
Bob:London
Charlie:Tokyo
Пример 3: Выбрать диапазон полей (с возраста до конца)
cut -d ':' -f 3- data.txt

Результат:

age:city
30:New York
25:London
35:Tokyo
Пример 4: Использование --complement (всё, кроме имени)
cut -d ':' -f 2 --complement data.txt

Результат:

id:age:city
1:30:New York
2:25:London
3:35:Tokyo
Пример 5: Использование -s (только строки с разделителем)

Это полезно, если в файле есть "мусорные" строки без разделителей.

# Добавим строку без двоеточий в файл
echo "This is a random line" >> data.txt
# Теперь выведем только строки, где есть ':'
cut -d ':' -f 1 -s data.txt

Работа с символами (-c)

Это полезно для файлов с фиксированной шириной колонок.

Предположим, у нас есть файл fixed_width.txt:

Alice   30  Engineer
Bob     25  Designer
Charlie 35  Manager
Пример: Извлечь символы с 1 по 10 и с 15 до конца
cut -c 1-10,15- fixed_width.txt

Результат:

Alice      Engineer
Bob        Designer
Charlie    Manager

Комбинирование с другими командами

cut часто используют в конвейерах (pipes).

Пример: Получить список всех пользователей из /etc/passwd

В файле /etc/passwd поля разделены двоеточиями :, а имя пользователя находится в первом поле.

cut -d ':' -f 1 /etc/passwd

Пример: Посчитать, сколько файлов в директории /usr/bin:

ls -l /usr/bin | cut -d ' ' -f 1 | wc -l

(Это не самый точный способ, но он демонстрирует идею).

Важные замечания

  • Разделитель по умолчанию: По умолчанию cut использует символ табуляции, а не пробел. Если ваши поля разделены пробелами, обязательно используйте -d ' '.
  • Пробелы как разделители: Если вы используете пробел как разделитель, несколько подряд идущих пробелов будут считаться одним разделителем. Для работы с "неровными" пробелами (как в выводе ls -l) лучше использовать awk.
  • Альтернативы: Для более сложной обработки текста (например, когда поля разделены переменным количеством пробелов) часто удобнее использовать awk.

Сравнение:

# cut: не сработает корректно из-за разного количества пробелов
ls -l | cut -d ' ' -f 5
# awk: сработает идеально, так как он по умолчанию использует пробел как разделитель и сливает повторяющиеся пробелы
ls -l | awk '{print $5}'

Команда cut — это простой, быстрый и эффективный инструмент, который должен быть в арсенале каждого, кто работает с командной строкой Linux.

Примеры

UUID раздела

Где вместо /dev/sdX1 - ваш диск.

Источник - Установка c локального накопителя.

blkid |grep /dev/sdX1 | cut -f2 -d " " |cut -f2 -d "="

Тип ядра

Тип ядра - std-def, un-def и пр

echo $(uname -r) | cut -d '-' -f 2-3

Для ядра с числовой "версией"

echo $(uname -r | cut -d '-' -f 2-3 | rev | cut -d '-' -f 2- | rev)