Как пользователи Linux, мы регулярно взаимодействуем с текстовыми файлами. Одной из распространенных операций, которые мы выполняем с этими файлами, является фильтрация текста. Linux предоставляет множество утилит командной строки для фильтрации текста, таких как grep, fgrep, sed, awk, и это еще маленькая часть от того, какие инструменты имеются.
В этой статье мы обсудим еще одну утилиту фильтрации текста, называемую cut, которая используется для удаления определенного раздела из строки ввода. Команда вырезания выполняет фильтрацию на основе позиции байта, символа, поля и разделителя.
Мы познакомимся с командой вырезания на примерах в командной строке Linux. После прочтения этой статьи вы сможете эффективно использовать команду Cut при работе с текстами файлов в Linux.
Синтаксис
Синтаксис команды cut такой же, как и у многих команд Linux:
cut <OPTIONS>... [FILE-1] [FILE-2] ....
В приведенном выше синтаксисе, текст в угловых скобка <> представляет обязательные аргументы, а в квадратных [] представляет необязательные параметры.
Теперь мы знакомы с синтаксисом команды cut. Теперь давайте создадим образец файла для использования в качестве примера:
$ cat file.txt Name Latest_Release Package_Manager Ubuntu 23.04 apt Red Hat 9.1 dnf Debian 11.6 apt Rocky Linux 9.1 dnf Alma Linux 9.1 dnf
Печать первого байта каждой строки
Команда вырезания позволяет нам извлечь текст на основе позиции байта, используя опцию -b.
Давайте воспользуемся командой ниже, чтобы извлечь первый байт из каждой строки файла:
$ cut -b 1 file.txt N U R D R A
В этом примере мы видим, что команда вырезания показывает только первый символ, поскольку все символы имеют длину один байт.
Печать нескольких байтов
В предыдущем примере мы увидели, как выбрать один байт из файла. Однако команда вырезания также позволяет нам выбирать несколько байтов с помощью запятой.
Давайте воспользуемся командой ниже, чтобы выбрать первые четыре байта из файла:
$ cut -b 1,2,3,4 file.txt Name Ubun Red Debi Rock Alma
В этом примере мы выбрали последовательные байты, но это не обязательно. С помощью команды вырезания мы можем использовать любую допустимую позицию байта.
Печать диапазона байтов
В предыдущем примере мы использовали запятые для выбора последовательных байтов. Однако этот подход не подходит, если мы хотим последовательно выбрать большое количество байтов. В таких случаях мы можем использовать дефис (-) для указания необходимого диапазона.
Чтобы понять это, давайте использовать 1-12 в качестве диапазона байтов, чтобы выбрать первые двенадцать байтов из каждой строки:
$ cut -b 1-12 file.txt Name Ubuntu Red Hat Debian Rocky Linux Alma Linux
Аналогичным образом мы также можем выбрать диапазон байтов из середины. Например, следующая команда выбирает байты из столбцов с номерами от 17 до 30:
$ cut -b 17-30 file.txt Latest_Release 23.04 9.1 11.6 9.1 9.1
Печать с указанием начальной позиции байта
Иногда нам нужно извлечь весь текст из определенной позиции байта. В таких случаях можно опустить позицию конечного байта.
Например, мы можем использовать следующую команду для печати всех байтов, начиная с позиции 17:
$ cut -b 17- file.txt Latest_Release Package_Manager 23.04 apt 9.1 dnf 11.6 apt 9.1 dnf 9.1 dnf
В приведенной выше команде 17 представляет позицию начального байта, а дефис (-) представляет конец строки.
Печать с указанием конечной позиции байта
Аналогичным образом мы также можем указать только позицию конечного байта. Например, команда ниже печатает все байты от начала строки до 12-го столбца:
$ cut -b -12 file.txt Name Ubuntu Red Hat Debian Rocky Linux Alma Linux
В приведенной выше команде дефис (-) представляет начало строки, тогда как 12 представляет позицию конечного байта.
Вырезать первый байт по позиции символа
В последних нескольких разделах мы увидели, как выполнять извлечение текста на основе позиции байта. Теперь давайте посмотрим, как выполнить извлечение текста по позиции символа.
Для этого мы можем использовать опцию -с, чтобы вырезать третий байт из следующей многобайтовой строки:
$ echo roаdit | cut -b 3 �
В приведенном выше выводе мы видим, что команда вырезания показывает вопросительный знак вместо символа а. Это происходит потому, что мы пытаемся напечатать первый байт многобайтового символа. А многобайтовый он, потому что я преднамеренно ввел его в русской кодировке.
Теперь давайте воспользуемся опцией -c, чтобы вырезать тот же многобайтовый символ, и посмотрим на результат:
$ echo roаdit | cut -c 3 а
В приведенном выше выводе мы видим, что теперь команда вырезания показывает ожидаемый результат.
Важно отметить, что не все версии команд вырезания поддерживают многобайтовые символы. Например, Ubuntu и ее производные не поддерживают многобайтовые символы.
При запуске той же команду в Ubuntu:
$ echo roаdit | cut -с 3 cut: invalid option -- '�' Try 'cut --help' for more information.
Здесь мы видим, что команда вырезания одинаково обрабатывает как многобайтовые, так и однобайтовые символы, поэтому и такой результат.
Вырезать строку по разделителю.
По умолчанию команда вырезания использует символ табуляции в качестве разделителя. Однако мы можем переопределить это поведение по умолчанию, используя опцию -d.
Часто опция -d используется в сочетании с опцией -f, которая используется для выбора определенного поля.
Для понимания, давайте используем пробел в качестве разделителя и напечатаем первые два поля, используя опцию -f:
$ cut -d " " -f 1,2 file.txt Name Ubuntu Red Hat Debian Rocky Linux Alma Linux
В приведенном выше примере мы использовали запятую с опцией -f для выбора нескольких полей.
Печать всех символов, кроме указанных
Иногда нам нужно напечатать все символы, кроме нескольких. В таких случаях мы можем использовать опцию —complement. Эта опция печатает все столбцы, кроме указанных.
$ cut -c 1 --complement file.txt ame Latest_Release Package_Manager buntu 23.04 apt ed Hat 9.1 dnf ebian 11.6 apt ocky Linux 9.1 dnf lma Linux 9.1 dnf
В приведенном выше выводе мы видим, что опция —complement печатает все символы, кроме первого.
Заключение
В этой статье обсудили практические примеры команды cut с фильтрацией текста на основе позиции байта, позиции символа и разделителя. Надеюсь будет полезно.
А, если вы знаете какой-нибудь еще хороший способ применения этой команды, то поделитесь обязательно им в комментариях.
Was this helpful?
0 / 0