
В системах Linux и Unix существует множество утилит для обработки и фильтрации текстовых файлов. cut — это утилита командной строки, которая позволяет вырезать фрагменты строк из указанных файлов или переданных данных и выводить результат на стандартный вывод. С её помощью можно вырезать фрагменты строк по разделителю, позиции байта и символу.
В этой статье будет показано, как использовать команду cut с помощью практических примеров и подробных объяснений наиболее распространенных опций.
Как использовать команду cut
Синтаксис команды cut следующий:
cut OPTION... [ FILE ] ...
Флаги, которые указывают cut , следует ли использовать разделитель, позицию байта или символ при вырезании выбранных частей строк, следующие:
-
-f(--fields=LIST) — выбор поля, набора полей или диапазона полей. Это наиболее часто используемый параметр. -
-b(--bytes=LIST) — выбор путем указания байта, набора байтов или диапазона байтов. -
-c(--characters=LIST) — выбор путем указания символа, набора символов или диапазона символов.
Вы можете использовать только один из перечисленных выше флагов.
Другие флаги:
-
-d(--delimiter) — укажите разделитель, который будет использоваться вместо разделителя «TAB» по умолчанию. -
--complement— Дополнить выделенное. При использовании этой опцииcutотображает все байты, символы и поля, кроме выбранных. -
-s(--only-delimited) — по умолчаниюcutпечатает строки, не содержащие разделителей. При использовании этого параметраcutне печатает строки, не содержащие разделителей. -
--output-delimiter— По умолчанию командаcutиспользует входной разделитель в качестве выходного разделителя. Этот параметр позволяет указать другую строку выходного разделителя.
Команда cut может принимать ноль или более имён ФАЙЛОВ. Если FILE не указан или FILE равен - , cut будет читать данные из стандартного потока ввода.
Аргумент LIST , передаваемый опциям -f , -b и -c может быть целым числом, несколькими целыми числами, разделёнными запятыми, диапазоном целых чисел или несколькими диапазонами целых чисел, разделёнными запятыми. Каждый диапазон может быть одним из следующих:
-
NN-ое поле, байт или символ, начиная с 1. -
N-от N-го поля, байта или символа до конца строки. -
NMот N-го до M-го поля, байта или символа. -
-Mот первого до M-го поля, байта или символа.
Как разрезать по поля
Чтобы указать поля, которые следует вырезать, вызовите команду с опцией -f . Если опция не указана, разделителем по умолчанию будет символ табуляции.
В примерах ниже мы будем использовать следующий файл. Поля разделены табуляцией.
тест.txt
245:789 4567 M:4540 Admin 01:10:1980 535:763 4987 M:3476 Sales 11:04:1978
Например, чтобы отобразить 1-е и 3-е поля, можно использовать:
cut test.txt -f 1,3
245:789 M:4540 535:763 M:3476
Или если вы хотите отобразить с 1-го по 4-е поле:
cut test.txt -f -4
245:789 4567 M:4540 Admin 535:763 4987 M:3476 Sales
Как вырезать по разделителю
Чтобы выполнить обрезку по разделителю, вызовите команду с опцией -d , а затем укажите разделитель, который вы хотите использовать.
Например, чтобы отобразить 1-е и 3-е поля, используя «:» в качестве разделителя, введите:
cut test.txt -d ':' -f 1,3
245:4540 Admin 01 535:3476 Sales 11
В качестве разделителя можно использовать любой одиночный символ. В следующем примере мы используем пробел в качестве разделителя и выводим второе поле:
echo "Lorem ipsum dolor sit amet" | cut -d ' ' -f 2
ipsum
Как дополнить выбор
Чтобы дополнить список выбранных полей, используйте опцию --complement . Это позволит вывести только те поля, которые не были выбраны опцией -f .
Следующая команда выведет на печать все поля, кроме 1-го и 3-го:
cut test.txt -f 1,3 --complement
4567 Admin 01:10:1980 4987 Sales 11:04:1978
Как указать разделитель вывода
Чтобы указать разделитель вывода, используйте опцию --output-delimiter . Например, чтобы задать разделитель вывода как _ , используйте:
cut test.txt -f 1,3 --output-delimiter='_'
245:789_M:4540 535:763_M:3476
Как резать по байтам и символам
Прежде чем двигаться дальше, давайте проведем различие между байтами и символами.
Один байт состоит из 8 бит и может представлять 256 различных значений. Когда был установлен стандарт ASCII, он учитывал все буквы, цифры и символы, необходимые для работы с английским языком. Таблица символов ASCII содержит 128 символов, каждый из которых представлен одним байтом. Когда компьютеры стали доступны по всему миру, технологические компании представили новые кодировки символов для разных языков. Для языков с более чем 256 символами простое сопоставление 1 к 1 было невозможно. Это привело ко многим проблемам, таким как обмен документами или просмотр веб-сайтов, и потребовался новый стандарт Unicode, который мог бы поддерживать большинство мировых систем письменности. Для решения этих проблем был создан UTF-8. В UTF-8 не все символы представлены одним байтом. Символы могут быть представлены от 1 до 4 байтов.
Опция -b ( --bytes ) указывает команде вырезать разделы из каждой строки, заданные заданными позициями байтов.
В следующих примерах мы используем символ ü , который занимает 2 байта.
Выберите 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
На момент написания этой статьи версия cut , входящая в состав GNU coreutils, не имела возможности посимвольного разрезания. При использовании опции -c cut ведёт себя так же, как при использовании опции -b .
Примеры вырезания
Команда cut обычно используется в сочетании с другими командами через конвейер. Вот несколько примеров:
Получить список всех пользователей
Вывод команды getent passwd передается в cut , которая печатает первое поле, используя : в качестве разделителя.
getent passwd | cut -d ':' -f1
На выходе выводится список всех пользователей системы .
Посмотреть 10 наиболее часто используемых команд
В следующем примере cut используется для удаления первых 8 байтов из каждой строки вывода команды history .
history | cut -c8- | sort | uniq -c | sort -rn | head
Заключение
Команда cut используется для отображения выбранных полей из каждой строки указанных файлов или стандартного ввода.
Несмотря на свою полезность, cut имеет некоторые ограничения. Она не поддерживает указание более одного символа в качестве разделителя и не поддерживает использование нескольких разделителей.
Если у вас есть вопросы или пожелания, не стесняйтесь оставлять комментарии.
Связанные руководства