Команда cut в Linux
В системах Linux и Unix существует множество утилит, которые можно использовать для обработки и фильтрации текстовых файлов. cut - это утилита командной строки, которая позволяет вырезать части строк из указанных файлов или данных с выводом результата. С ее помощью можно вырезать части строки по разделителю, позиции байта и символу.
В этой статье вы узнаете, как использовать команду 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
Команда cut обычно используется в сочетании с другими командами. Вот несколько примеров:
Получить список всех пользователей
Вывод команды getent passwd передается команде cut, которая печатает 1-е поле, используя : в качестве разделителя.
$ getent passwd | cut -d ':' -f1
Просмотр 10 наиболее часто используемых команд
В следующем примере команда cut используется для удаления первых 8 байт из каждой строки вывода команды history.
$ history | cut -b8- | sort | uniq -c | sort -rn | head
Стоит учесть, что cut имеет ряд ограничений. Команда не поддерживает указание более одного символа в качестве разделителя и не поддерживает множественные разделители.