Команда cut
Команда cut позволяет выбрать из каждой строки файла нужную часть (по единому правилу для всех строк) и показать выборку на экране дисплея.
Команда имеет три основные опции:
- -b — когда объектом выбора являются байты;
- -с — когда объектом выбора являются символы;
- -f — когда объектом выбора являются элементы форматирования текста (колонки, столбцы и прочее).
Внимание: Опции -c, -b, и -f могут употребляться только поодиночке.
Начнем с наиболее очевидного — символов (опция -с)
Опция -с
Например, возьмем файл /etc/shells, в целом виде он выглядит так:
/bin/bash /bin/tcsh /bin/csh /bin/ash /bin/ksh /bin/zsh
В данном примере опция -c означает, что объектом выбора будут символы, цифры 1 и 5 означают, что мы выбираем первый и пятый символы строки (счет идет с 1), а все остальное содержимое файла игнорируется.
Можно выбирать символы не по порядковым номерам, а диапазонами:
$ cut -c 1-5 /etc/shells /bin/ /bin/ /bin/ /bin/ /bin/ /bin/
В этом случае мы выбрали символы в диапазоне с 1 по 5 (включительно).
Можно указать несколько диапазонов через запятую:
~$ cut -c 1-5,8-9 /etc/shells /bin/sh /bin/sh /bin/h /bin/h /bin/h /bin/h
Первые три примера имеют чисто демонстрационный характер и не имеют практического смысла. Следующий пример может претендовать на некий смысл:
$ cut -c 6- /etc/shells bash tcsh csh ash ksh zsh
Тут мы получили список доступных в системе шеллов. Для этого мы не стали указывать правую границу диапазона, что заставляет команду выдавать все содержимое строк от указанного символа до конца строки. Можно оставить прочерк с левой стороны, тогда выборка пойдет от начала строки до указанного символа.
Опция -b
Весьма похожа на предыдущую опцию, как по способу задания выборки байт, так и по результатам, ведь в большинстве случаев один байт определяет один символ.
$ cut -b 1-6 /etc/shells /bin/b /bin/t /bin/c /bin/a /bin/k /bin/z
Мы выбрали первые 6 байт из каждой строки файла /etc/shells.
Точно так же как и с опцией -с, можно использовать способы выборки n,m; -n; и n-. Остается лишь добавить, что символы табуляции и backspace (возврат назад на один символ с удалением его) трактуются как любой другой символ — они и занимают один байт. (Не поручусь за национальные кодировки).
Опция -f
Объектом выбора данной опции являются те самые загадочные «поля», о которых я говорил в предисловии. Оказалось все просто. Выбираем мы колонки текста, или столбцы, или что еще там, разделенные знаком табуляции. Так как я таких файлов никогда не встречал, то пришлось создать специально для опытов. Вот содержимое файла tab.txt:
qwer tyui op[] asdf ghjk llll zxcv bnm, .
$ cut -f 1,2 tab.txt qwer tyui asdf ghjk zxcv bnm,
Все как ожидалось, выбраны две первые колонки. Еще пример:
$ cut -f 2- tab.txt tyui op[] ghjk llll bnm, .
В общем понятно, схема та же, только с колонками. Вопрос в другом — где взять такие файлы с колонками, разделенными знаком табуляции, чтобы их обрабатывать?
К счастью, есть опция -d, предназначенная для работы в паре с опцией -f и понимающая другие разделители текста, кроме знаков табуляции. В директории /etc полно файлов, содержащих столбцы данных, разделенных всякими разделителями; беда только, что они довольно длинные для примеров. Я возьму первые десять строчек из файла /etc/group и создам файл group10.txt.
$ cut -f 1- -d : group10.txt root::0:root bin::1:root,bin,daemon daemon::2:root,bin,daemon sys::3:root,bin,adm adm::4:root,adm,daemon tty::5: disk. 6:root,adm,haldaemon,ya,alex lp::7:lp,ya,alex mem::8: kmem::9:
В этом примере, опция -f приказывает отбирать все столбцы, с первого до последнего, а опция -d указывает на символ, являющийся разделителем -d : разделителем служит двоеточие. Выше на экране файл group10.txt полностью.
$ cut -f 1,3 -d : group10.txt root:0 bin:1 daemon:2 sys:3 adm:4 tty:5 disk:6 lp:7 mem:8 kmem:9
А сейчас мы отобрали первый и третий столбцы, то есть узнали идентификационный номер каждой группы. В остальном все те же правила выбора объекта, что и для прочих опций. Символы, разделяющие столбцы, разумеется, могут быть иными, нежели двоеточие. Их нужно задавать при помощи опции -d . Есть и более наглядный способ употребления опции -d. Вместо только что описанной конструкции (-d ) пишем —delim=, это кажется более надежным, чем при помощи пробела.
Небольшая хитрость. Во многих файлах символом разделения служит пробел, или несколько пробелов подряд (например файл /etc/fstab). Чтобы указать разделитель для таких файлов, нужно заключить пробел в кавычки (одинарные или двойные); только тогда програма поймет, что разделителем служит пробел:
$ cut -f 1-21 -d " " /etc/fstab /dev/hda7 swap /dev/hdb5 swap /dev/hdb1 / devpts /dev/pts devpts proc /proc usbfs /proc/bus/usb /dev/hda1 /mnt/win_c /dev/hda5 /mnt/win_d /dev/fd0 /mnt/floppy
Как указать разделителем несколько пробелов, осталось неизвестным.
Опция -s
Опция -s употребляется с опцией -f и приказывает не выводить на экран строки, не содержащие символов-разделителей.
Опция -n
Опция -n употребляется вместе с опцией -b (когда объектом выборки являются байты). Эта опция пишется первой и запрещает команде разбивать многобайтные символы. Другими словами, если символ записывается более чем одним байтом, и мы, указывая выборку, случайно попадем на такой многобайтный символ, то в выводе программы появятся вопросительные знаки, либо квадратики, свидетельствующие о том, что программа не до конца считала этот символ и не знает как его интерпретировать. Например:
(Символы кириллицы в кодировке UTF-8 состоят из 2 байтов). Стоит добавить опцию -n, как команда перестанет пытаться читать часть многобайтного символа:
$ cut -n -b 1-5 rus.txt йц фы яч
Опция —complement
Встречается в версиях команды cut от GNU Coreutils. Но редко встречается в манах. Опция употребляется совместно с опциями -b, -c и -f. Эта опция дополнит выборку всеми остальными объектами выбора. Другими словами, те объекты, которые вы укажете, не появятся в выводе команды, зато все остальные — появятся. Например:
$ cut -f 1 --complement tab.txt tyui op[] ghjk llll bnm, .
Указанный первый столбец не появился, зато остальные два оказались в выводе команды. Опция очень удобна, когда у вас множество столбцов или колонок текста, а вам нужно распечатать их все, за исключением одной-двух-трех.
Резюме программы cut
Программа применима и эффективно работает с регулярными файлами, те есть с файлами, где из строчки в строчку повторяется некая структура информации (всякого рода списки, перечни, распечатки и прочее). Трудно представить себе, как ее можно использовать с обычным текстом, не разбитым на строки. Наличие трех подходов (байты, символы и столбцы) к определению выборки позволяют добиться успеха почти в любом случае, не одним способом, так другим. Особенно полезной может быть команда в качестве фильтра в составе программных каналов (pipes).
Команда cut в Linux
Команда cut вырезает участки каждой строки файла и выводит результаты в стандартный поток вывода. Она может вырезать часть строки по расположению байта, символу и полю. В сущности она разрезает строку на участки и извлекает из них текст. С этой командой обязательно нужно указывать опции, иначе она выдаст ошибку. Если указать несколько файлов, то при выводе данных имена файлов перед ними не выводятся. Команда работает как с файлами так и с выводом из другой команды.
Синтаксис
Допустим, у нас есть файл state.txt, содержащий названия 5 государств:
$ cat state.txt Россия Германия Нидерланды Соединенное Королевство Испания
Если опций не указывать, то команда выдаст ошибку:
$ cut state.txt cut: you must specify a list of bytes, characters, or fields Try 'cut --help' for more information.
Опции и их описания с примерами
1. -b (byte, байт): используется для извлечения заданных байтов, номера которых указываются после опции через запятую. Можно указать диапазоны через дефис. Если не указать ничего, команда выдаст ошибку. Символы табуляции и пробелы рассматриваются как символы размером в один байт.
$ cut -b 1,2,3 state.txt Рос Гер Нид Сое Исп
$ cut -b 1-3,5-7 state.txt Росия Герани Нидрла Соеине Испния
echo Россия | cut -b 1,2,3 Рос
Для выбора байтов от заданной позиции до конца строки используется следующая форма:
$ cut -b 1- state.txt Россия Германия Нидерланды Соединенное Королевство Испания
Аналогичным образом можно указать байты от начала строки до заданной позиции:
$ cut -b -3 state.txt Рос Гер Нид Сое Исп
2. -c (column, столбец): используется для вырезания по символам. Это также может быть список символов, указанных через запятую, или диапазон, заданный через дефис. Символы табуляции и пробела интерпретируются как один символ. Номера символов указывать обязательно, иначе команда выдаст ошибку.
где k – начальный символ, а n – конечный, если они разделены дефисом, либо просто позиции символов, указанные через запятую.
Следующая команда вырезает второй, пятый и седьмой символы строк:
$ cut -c 2,5,7 state.txt ои еаи ира оие сня
А эта команда – выводит первые семь символов каждой строки файла:
$ cut -c 1-7 state.txt Россия Германи Нидерла Соедине Испания
Интервалы от заданной позиции до конца строки и от начала строки до заданной позиции задаются аналогично предыдущей опции:
$ cut -c 1- state.txt Россия Германия Нидерланды Соединенное Королевство Испания
$ cut -c -5 state.txt Росси Герма Нидер Соеди Испан
3. -f (field, поле): опция -с полезна для строк фиксированной длины, однако в большинстве файлов они не встречаются. Вам потребуется вырезать данные по полям, а не по столбцам, чтобы получить нужную информацию. Для этого используется опция -f. Номера полей должны разделяться запятыми. Данная опция не позволяет указывать диапазоны. По умолчанию в качестве разделителя полей используется символ табуляции, но при помощи опции -d можно задать другой разделитель.
Важно: по умолчанию пробел не является разделителем.
$cut -d "разделитель" -f (номер поля) файл
В файле state.txt поля разделены пробелами, и если не использовать опцию -d, строки будут выводиться целиком:
$ cut -f 1 state.txt Россия Германия Нидерланды Соединенное Королевство Испания
При помощи опции -d можно задать в качестве разделителя пробел:
$ cut -d " " -f 1 state.txt Россия Германия Нидерланды Соединенное Испания
Было выведено каждое слово до пробела.
4. –complement: используется с другими опциями, например, -f или -c, и инвертирует опции вывода:
$ cut --complement -d " " -f 1 state.txt Россия Германия Нидерланды Королевство Испания
$ cut --complement -c 5 state.txt Росся Гермния Ниделанды Соедненное Королевство Испаия
5. –output-delimiter: По умолчанию разделитель выводимых данных такой же, как указанный в опции -d. Чтобы его изменить, воспользуйтесь опцией –output-delimiter. Следующая команда задает в качестве разделителя вывода символ «%» и выводит 1 и 2 поля с опцией -f:
$ cut -d " " -f 1,2 state.txt --output-delimiter='%' Россия Германия Нидерланды Соединенное%Королевство Испания
6. –version: Выводит информацию о версии команды:
$ cut --version cut (GNU coreutils) 8.26 Packaged by Cygwin (8.26-2) Copyright (C) 2016 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later . This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Written by David M. Ihnat, David MacKenzie, and Jim Meyering.
7. –help: Выводит справочную информацию.
Еще несколько полезных примеров
ifconfig eth0 | grep HWaddr | cut -d » » -f 11
Заключение
Команда cut очень простая, но широко используется для работы с текстовыми данными, часто в сочетании с другими командами, такими как cat или sort. Мы разобрали практически все ее опции. Однако, в разных системах версии команды и ее опции могут немного отличаться, для уточнения обратитесь к соответствующим man-страницам.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.