Cut start
Многие слышали про команду 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)