Команда cut в Linux

В системах Linux и Unix существует множество утилит, которые можно использовать для обработки и фильтрации текстовых файлов. cut - это утилита командной строки, которая позволяет вырезать части строк из указанных файлов или данных с выводом результата. С ее помощью можно вырезать части строки по разделителю, позиции байта и символу.

В этой статье вы узнаете, как использовать команду cut на практических примерах и с подробным объяснением наиболее распространенных опций.

Синтаксис команды cut следующий:

cut OPTION... [FILE]...

Флаги, указывающие команде cut, использовать ли разделитель, позицию байта или символ при вырезании выбранных частей строк, следующие:

  -f (--fields=СПИСОК) - Выводит только столбцы (поля), перечисленные в СПИСКЕ. По умолчанию столбцы разделяются символами табуляции. Это наиболее часто используемый параметр.
  -b (--bytes=СПИСОК) - Выводит только байты из позиций, указанных в СПИСКЕ. Символы <Tab> (табуляции) и backspace (возврат на символ) трактуются подобно другим символам и занимают один байт.
  -c (--characters=СПИСОК) - выводит только символы из позиций, указанных в СПИСКЕ. С одной стороны очень похожа на опцию -b, но в случае интернационализации может отличаться.

Вы можете использовать один и только один из перечисленных выше флагов.

Другие флаги:

  -d (--delimiter=РАЗДЕЛИТЕЛЬ) - задает РАЗДЕЛИТЕЛЬ колонок (полей) входного файла вместо символа табуляции. Применяется совместно с опцией -f.
  --complement - дополнить выборку. При использовании этой опции cut отображает все байты, символы или поля, кроме явно указанных.
  -s (--only-delimited) - По умолчанию cut печатает строки, не содержащие символов-разделителей. При использовании этой опции cut не не выводит строки, в которых отсутствует разделитель полей. Применяется совместно с опцией -f.
  --output-delimiter=РАЗДЕЛИТЕЛЬ - По умолчанию cut использует входной разделитель в качестве выходного разделителя. Эта опция позволяет разделять указанным РАЗДЕЛИТЕЛЕМ поля выходного потока. Применяется совместно с опцией -f.

Аргумент СПИСОК, передаваемый опциям -f, -b и -c, может быть целым числом, несколькими целыми числами, разделенными запятыми, диапазоном целых чисел или несколькими диапазонами целых чисел, разделенных запятыми. Каждый диапазон может быть одним из следующих:

  • n - n-ое поле, байт или символ, начиная с 1.
  • n- от n-го поля, байта или символа до конца строки.
  • n-m от n-го до m-го поля, байта или символа.
  • -m от первого до m-го поля, байта или символа.

Чтобы указать поля, которые должны быть выведены, вызовите команду cut с опцией -f. Если не задана дополнительная опция, по умолчанию используется разделитель «TAB».

В примерах ниже мы будем использовать файл test.txt со следующим содержанием. Поля в нем разделены табуляцией.

245:789 4567    M:4540  Admin   01.10.1980
535:763 4987    M:3476  User    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  User

Чтобы сделать срез на основе разделителя, вызовите команду с опцией -d, а затем введите разделитель, который вы хотите использовать.

Например, чтобы отобразить 1-е и 3-е поля, используя «:» в качестве разделителя, введите:

$ cut test.txt -d ':' -f 1,3

Результат

245:4540  Admin   01.10.1980
535:3476  User    11.04.1978

В качестве разделителя можно использовать любой символ. В следующем примере мы используем символ пробела в качестве разделителя и вычленим 2-е поле:

$ 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	User	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-й и 6-й байты (в данной команде отсчет идет с 1):

$ echo 'Санкт-Петербург' | cut -b 5,6

Получим

н

Выберем 5,6,11,14,15 байты :

$ echo 'Санкт-Петербург' | cut -b 5,6,11,14,15

Получим

н-е

Выберем до 11-го байта :

$ echo 'Санкт-Петербург' | cut -b -11

Получим

Санкт-

На момент написания этой статьи версия cut, входящая в состав GNU coreutils, по прежнему не имеет опции вырезания по символам. При использовании опции -c программа cut ведет себя так же, как и при использовании опции -b.

Команда cut обычно используется в сочетании с другими командами. Вот несколько примеров:

Вывод команды getent passwd передается команде cut, которая печатает 1-е поле, используя : в качестве разделителя.

$ getent passwd | cut -d ':' -f1

В следующем примере команда cut используется для удаления первых 8 байт из каждой строки вывода команды history.

$ history | cut -b8- | sort | uniq -c | sort -rn | head

Стоит учесть, что cut имеет ряд ограничений. Команда не поддерживает указание более одного символа в качестве разделителя и не поддерживает множественные разделители.