Введение
В системах Linux и Unix доступно множество утилит, позволяющих обрабатывать и фильтровать текстовые файлы. Cut — это утилита командной строки, которая позволяет вырезать части строк из указанных файлов или данных конвейера и распечатать результат на стандартном выходе. Его можно использовать для вырезания частей строки по разделителю, положению байта и символу.
В этом руководстве мы покажем вам, как использовать команду обрезки Linux, на практических примерах и подробных объяснениях наиболее распространенных параметров обрезки.
Используйте команду «Вырезать».
Синтаксис команды cut следующий:
cut OPTION... [FILE]...
При использовании команды вырезания вам необходимо использовать одну и только одну из следующих опций:
-f
(--fields=LIST
): выберите, указав поле, набор полей или диапазон полей. Это наиболее часто используемый вариант.-b
(--bytes=LIST
): выберите, указав байт, набор байтов или диапазон байтов.-c
(--characters=LIST
): выберите, указав символ, набор символов или диапазон символов.
Другие варианты:
-d
(--delimiter
) — определяет разделитель, который будет использоваться вместо стандартного разделителя «TAB».--complement
— интегрировать выделение. Когда используется эта опция, cut будет отображать все байты, символы или поля, кроме выбранных.-s
(--only-delimited
) — по умолчанию cut будет печатать любую строку, не содержащую символы-разделители. Когда используется этот параметр, cut не печатает строки, не содержащие разделителей.--output-delimiter
— по умолчанию используется разделитель ввода в качестве разделителя вывода. Эта опция позволяет указать другую строку разделителя вывода.
Команда вырезания может принимать ноль или более входных имен ФАЙЛОВ. Если FILE не указан или если FILE равен -
, cut будет читать стандартный ввод.
Аргумент LIST с параметрами -f
, -b
и -c
может быть целым числом, несколькими целыми числами, разделенными запятыми, серией целых чисел или несколькими диапазонами целых чисел, разделенными запятыми. Каждый интервал может быть одним из следующих:
N
n-ое поле, байт или символ, начиная с 1.N-
от n-го поля, байта или символа до конца строки.NM
от n-го до n-го поля, байта или символа.-M
с первого по n-е поле, байт или символ.
Вырезать по полю
Команда «Вырезать» в основном используется для отображения выбранных полей из каждой строки файла или стандартного ввода. Если не указано, разделителем по умолчанию является TAB.
В следующих примерах мы будем использовать файл test.txt. Все поля разделены вкладками.
321:235 7689 M:2354 Admin 02:11:1980
345:956 1254 M:5765 Sales 12:03:1979
Чтобы отобразить 1-е и 3-е поля, вы должны использовать:
cut test.txt -f 1,3
321:235 M:2354
345:956 M:5765
Или, если вы хотите отображать с 1-го по 4-е поле:
cut test.txt -f -4
321:235 7689 M:2354 Admin
345:956 1254 M:5765 Sales
Вырезать по разделителю
Чтобы вырезать на основе разделителя, используйте параметр -d
, за которым следует разделитель, который вы хотите использовать.
Например, чтобы отобразить 1-е и 3-е поля, используя «:» в качестве разделителя, введите:
cut test.txt -d ':' -f 1,3
321:7689 Admin 01
345:1254 Sales 11
Вы можете использовать любой одиночный символ в качестве разделителя. В следующем примере мы используем символ пробела в качестве разделителя и печатаем второе поле:
echo "Lorem ipsum dolor sit amet" | cut -d ' ' -f 2
ipsum
Интегрировать выбор
Чтобы завершить список полей выбора, используйте параметр --complement
. Это напечатает только те поля, которые не выбраны с помощью опции -f
.
Следующая команда напечатает все поля, кроме 1-го и 3-го:
cut test.txt -f 1,3 --complement
7689 Admin 02:11:1980
1254 Sales 12:03:1979
Укажите выходной разделитель
Чтобы указать разделитель вывода, используйте параметр --output-delimiter
. Например, чтобы установить разделитель вывода на _
:
cut test.txt -f 1,3 --output-delimiter='_'
321:235_M:2354
345:956_M:5765
Вырезать по байтам и символам
Прежде чем идти дальше, давайте проведем различие между байтами и символами.
Один байт равен 8 битам и может представлять 256 различных значений. Когда был установлен стандарт ASCII, в нем учитывались все буквы, цифры и символы, необходимые для работы с английским языком. Таблица символов ASCII содержит 128 символов, и каждый символ представлен одним байтом. Когда компьютеры стали популярными во всем мире, технологические компании начали вводить новые кодировки символов для разных языков, а для языков с более чем 256 символами простое сопоставление 1 к 1 было невозможно.Это приводит к различным проблемам, таким как совместное использование документов. или просмотр веб-сайтов, и требовался новый стандарт Unicode, который мог бы работать с большинством систем письма в мире. UTF-8 был создан для решения этих проблем. В UTF-8 не все символы представлены одним байтом. Символы могут быть представлены от 1 байта до 4 байтов.
В приведенных ниже примерах мы используем символ ü
, для которого требуется 2 байта.
Используйте параметр -b
( --bytes
), чтобы обрезать часть строки, указав позицию в байтах.
Выберите 5-й байт:
echo 'drüberspringen' | cut -b 5
b
Выберите 5-й, 9-й и 13-й байты:
echo 'drüberspringen' | cut -b 5,9,13
bpg
Выберите диапазон от 1-го до 5-го байта:
echo 'drüberspringen' | cut -b 1-5
drüb
На момент написания этой статьи версия для обрезки в GNU coreutils не имеет возможности обрезки по символам. При использовании опции -c
cut она ведет себя так же, как и при использовании опции -b
.
Примеры вырезания
Команда cut обычно используется в сочетании с другими командами через трубопровод. Вот несколько примеров.
Получить список всех пользователей
Вывод команды getent passwd
передается команде cut
, которая печатает первое сохраненное значение, используя :
в качестве разделителя.
getent passwd | cut -d ':' -f1
Посмотреть 10 наиболее часто используемых команд
В следующем примере обрезка используется для удаления первых 8 байтов из каждой строки вывода команды history
.
history | cut -c8- | sort | uniq -c | sort -rn | head
Вывод
К настоящему времени вы должны хорошо понимать, как использовать команду cut в Linux. Хотя команда cut очень полезна, у нее есть некоторые ограничения. Он не поддерживает указание более одного символа в качестве разделителя и не поддерживает несколько дециметров.