Cut

Материал из Ай да Linux Wiki
Перейти к навигации Перейти к поиску

Описание

Команда cut позволяет выбрать из каждой строки файла нужную часть (по единому правилу для всех строк) и показать выборку на экране дисплея.

Команда имеет три основные опции:

  • -b - когда объектом выбора являются байты;
  • -с - когда объектом выбора являются символы;
  • -f - когда объектом выбора являются элементы форматирования текста (колонки, столбцы и прочее).

Внимание: Опции -c, -b, и -f могут употребляться только поодиночке.

Основные параметры

Опция -с

Например, возьмем файл /etc/shells, в целом виде он выглядит так:

 /bin/bash
 /bin/tcsh
 /bin/csh
 /bin/ash
 /bin/ksh
 /bin/zsh

Теперь применим команду:

 $ cut -c 1,5 /etc/shells
 //
 //
 //
 //
 //
 //

В данном примере опция -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

Тут мы получили список доступных в системе шеллов. Для этого мы не стали указывать правую границу диапазона, что заставляет команду выдавать все содержимое строк от указанного символа до конца строки. Можно оставить прочерк с левой стороны, тогда выборка пойдет от начала строки до указанного символа.

Надеюсь, что с опцией -c ясность полная, можно переходить к следующей.

Опция -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 (когда объектом выборки являются байты). Эта опция пишется первой и запрещает команде разбивать многобайтные символы. Другими словами, если символ записывается более чем одним байтом, и мы, указывая выборку, случайно попадем на такой многобайтный символ, то в выводе программы появятся вопросительные знаки, либо квадратики, свидетельствующие о том, что программа не до конца считала этот символ и не знает как его интерпретировать. Например:

 cut -b 1-5 rus.txt
 йц?
 фы?
 яч?

(Символы кириллицы в кодировке 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,    ....

Указанный первый столбец не появился, зато остальные два оказались в выводе команды. Опция очень удобна, когда у вас множество столбцов или колонок текста, а вам нужно распечатать их все, за исключением одной-двух-трех.

Опции --help и --version общеизвестны, и задерживаться на них я не буду.

Команда cut и символы кириллицы

Некоторые новейшие версии программы cut, в некоторых дистрибутивах, неплохо справляются с кириллическими символами. Другие версии, в других дистрибутивах не справляются вовсе. Я было попытался дать несколько примеров с кириллицей, но результаты на разных машинах, на разных дистрибутивах, и с разными версиями команды могли только сбить читателя с толку, не внеся никакой ясности. Поэтому общие рекомендации: не бойтесь пробовать работать с родным языком, если не получается, обновите версию программы, не выходит - попробуйте дистрибутив с другой кодировкой по умолчанию.

Несколько слов о версиях

В Линукс дистрибутивах в основном встречается команда cut от GNU Coreutils. Программа разрабатывается и новые версии появляются регулярно. Советую иметь новейшую стабильную версию. Мне попадались версии не первой свежести, которые откровенно "глючили" и не различали, скажем, опций -b и -c (cut (GNU coreutils) 5.97), а я-то думал, что так и надо. Поэтому при первом подозрении попробуйте другой дистрибутив (или LiveCD).

Резюме программы cut

Программа применима и эффективно работает с регулярными файлами, те есть с файлами, где из строчки в строчку повторяется некая структура информации (всякого рода списки, перечни, распечатки и прочее). Трудно представить себе, как ее можно использовать с обычным текстом, не разбитым на строки. Наличие трех подходов (байты, символы и столбцы) к определению выборки позволяют добиться успеха почти в любом случае, не одним способом, так другим. Особенно полезной может быть команда в качестве фильтра в составе программных каналов (pipes).



Информация взята с open-club.ru