Изучаем команды Linux: cut

Вэтом выпуске мы расскажем об основных возможностях форматирования вывода с помощью команд grep, sed, awk, cat и cut. Это может быть очень полезным, если соединять вместе такие вещи как Conky или скрипты, которые отображают информацию в терминале.

Сначала рассмотрим работу команды cut. Если бы мы хотели отобразить название дистрибутива в нашем скрипте, мы нашли бы его в /etc/issue. Если мы выполним cat /etc/issue, мы увидим много длинных строк со множеством экранирующих символов в них. Так, если мы выполним cat /etc/issue | head -n 1, мы уберём дополнительные строки, сузив вывод команды cat с помощью команды head, которая оставит только первую строку вывода. Пока всё хорошо, но что насчёт специальных символов? Для таких случаев у нас есть cut. Чтобы её использовать, мы должны указать разделитель, а затем сказать ей, что с ним делать. Мы могли бы выполнить следующую команду:

Cat /etc/issue|head -n 1|cut –-delimiter=" " -f 1,2

Эта команда говорит cut использовать в качестве разделителя знак пробела, и показать первые два поля (по существу, cut делит вывод на сегменты в соответствии с разделителем, поэтому поля 1 и 2 - это первые два поля до и после разделителя, в нашем случае это Ubuntu 8.10). Cut также можно использовать для отображения только определённого числа символов, используя флаг -c.

То же самое можно сделать и с помощью команды sed:

Cat /etc/issue|sed "{s/\\n// ; s/\\l// ; /^$/d}"

Это может показаться лишним, но первые два выражения (каждое из них разделено точкой с запятой) говорят sed заменить “\n” на “” (ничего), и то же самое для “\l”, убирая эти символы из вывода. Команда “/^$/d” говорит sed удалить все пустые строки (“^$” - это регулярное выражение для строки, которая начинается и заканчивается пустым символом, и посередине тоже ничего нет - т.е. пустая строка). Так "s/\\n\b//" просто говорит sed заменить (“s/”) “\n” (“\\n”) на “” (“//”). Причина, по которой эта команда в скобках, в том, что мы применяем три выражения на выходе, и хотим, чтобы результат появился только один раз, поэтому мы поместили выражения в скобки (“{}”), и разделили точкой с запятой.

В заключение, такой же результат мы можем получить с помощью awk:

Cat /etc/issue|awk "/\\n/ {print $1,$2}"

Эта команда тоже использует регулярные выражения, но её легче понять, чем sed. Команда awk "/\n/ {print $1, $2}" ищет любую строку, в которой есть “\n”, и затем печатает первые два поля (разделитель по умолчанию - это пробел, но вы можете определить свой с помощью флага -F). Это позволяет нам отбросить лишнюю строку и \l из вывода команды. Вы можете также отказаться от обрезания вывода в команде cat /etc/issue (или любой другой), так как они все могут быть применены к определенному файлу в конце команды. Я использовал cat для того, чтобы оставить команды более понятными.

Это всё рассматривается только как поверхностный взгляд на возможности awk, sed и cut. Из-за их гибкой реализации сложно написать краткое вводное руководство для всех них. Пояснения приведены, чтобы показать, как команды работают, а не описывать их полный потенциал. В реальном мире использование этих команд будет в первой половине любого собственного скрипта (ниже приведен пример, который также выводит информацию о скрипте, но часть не обязательно подходит к этой статье; она оставлена, чтобы оставить скрипт завершённым). Пример также содержит вызов для каждого, кто желает его попробовать: сообразите, как использовать одну из трёх команд, чтобы убрать параграф в памятной части скрипта, и, если вы хотите больше практики, попробуйте заменить каждое использование cut, sed или awk на другую команду, делающую то же самое (т.е. заменить команду cut на awk). Конечно, никакого приза нет, но это хорошая практика, чтобы понять внутреннюю работу этих команд.

Дополнительная информация.


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

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

  • -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 и 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

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

Интересно, что все эти примеры не всегда работают с русскими символами (в кодировке UTF-8, по крайней мере) - выдают какую-то странную ступенчатую распечатку:

$ cut -c 1- rus.txt йцукенгшщзхъ фывапролджэё ячсмитьбю.ёё

Это полный текст файла rus.txt. Программа сработала правильно.

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

А вот тут начались странности. Забавно, что даже следующее приглашение командной строки вышло по "лесенке". А вот в "настоящей" консоли, вызываемой нажатием Ctrl+Alt+F2, вывод той же команды выглядел более или менее прилично:

$ cut -c 1-5 rus.txt йц фы яч

Как выяснилось в многочисленных опытах, символы кириллицы в кодировке UTF-8 состоят из двух байтов, поэтому нужно вводить удвоенные числовые значения. Скажем, если заменить в предыдущей команде 5 на 6 (или любое другое четное число), то и в эмуляторе консоли все будет как надо:

$ cut -c 1-6 rus.txt йцу фыв ячс

Для чистоты эксперимента я запустил Knoppix5.1, у которого по умолчанию кодировка koi-8, так там никакой разницы с английским текстом не наблюдается - каждая буква представлена одним байтом:

$ cut -c 1-5 rus.txt йцуке фывап ячсми

Так что с национальными кодировками ухо надо держать востро!

Надеюсь, что с опцией -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=<символ>, это кажется более надежным, чем при помощи пробела.

Остались две опции: -s и -n

Опция -s употребляется с опцией -f и приказывает не выводить на экран строки, не содержащие символов-разделителей. Ясно даже мне.

Оставшиеся неясности

Опция -n осталась неопознанной мною. Она велит ничего не делать с многобайтными символами, в частности не разбивать их. Что это за символы я не знаю, как не знаю и того, что команда cut делает с ними по умолчанию. Есть и еще одна загадка. Как обозначить разделитель, если таковым является пробел? Или два-три пробела? Все мои эксперименты ни к чему не привели. Может кто-нибудь знает? Напишите мне, мой адрес в начале статьи.

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

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

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

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

Описание

Команда 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).

Команда 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

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

Опция -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, ....

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

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

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

The cut command in UNIX is a command for cutting out the sections from each line of files and writing the result to standard output. It can be used to cut parts of a line by byte position, character and field . Basically the cut command slices a line and extracts the text. It is necessary to specify option with command otherwise it gives error. If more than one file name is provided then data from each file is not precedes by its file name.

cut OPTION... ...

Let us consider two files having name state.txt and capital.txt contains 5 names of the Indian states and capitals respectively.

$ cat state.txt

Without any option specified it displays error.

$ cut state.txt cut: you must specify a list of bytes, characters, or fields Try "cut --help" for more information.

Options and their Description with examples:

1. -b(byte): To extract the specific bytes, you need to follow -b option with the list of byte numbers separated by comma. Range of bytes can also be specified using the hyphen(-). It is necessary to specify list of byte numbers otherwise it gives error. Tabs and backspaces are treated like as a character of 1 byte.

List without ranges $ cut -b 1,2,3 state.txt And Aru Ass Bih Chh List with ranges $ cut -b 1-3,5-7 state.txt Andra Aruach Assm Bihr Chhtti

It uses a special form for selecting bytes from beginning upto the end of the line:

In this, 1- indicate from 1st byte to end byte of a line $ cut -b 1- state.txt Andhra Pradesh Arunachal Pradesh Assam Bihar Chhattisgarh In this, -3 indicate from 1st byte to 3rd byte of a line $ cut -b -3 state.txt And Aru Ass Bih Chh

2. -c (column): To cut by character use the -c option. This selects the characters given to the -c option. This can be a list of numbers separated comma or a range of numbers separated by hyphen(-). Tabs and backspaces are treated as a character. It is necessary to specify list of character numbers otherwise it gives error with this option.

$cut -c [(k)-(n)/(k),(n)/(n)] filename

Here,k denotes the starting position of the character and n denotes the ending position of the character in each line, if k and n are separated by “-” otherwise they are only the position of character in each line from the file taken as an input.

$ cut -c 2,5,7 state.txt nr rah sm ir hti

Above cut command prints second, fifth and seventh character from each line of the file.

$ cut -c 1-7 state.txt Andhra Arunach Assam Bihar Chhatti

Above cut command prints first seven characters of each line from the file.

Cut uses a special form for selecting characters from beginning upto the end of the line:

$ cut -c 1- state.txt Andhra Pradesh Arunachal Pradesh Assam Bihar Chhattisgarh Above command prints starting from first character to end. Here in command only starting position is specified and the ending position is omitted. $ cut -c -5 state.txt Andhr Aruna Assam Bihar Chhat Above command prints starting position to the fifth character. Here the starting position is omitted and the ending position is specified.

3. -f (field): -c option is useful for fixed-length lines. Most unix files doesn’t have fixed-length lines. To extract the useful information you need to cut by fields rather than columns. List of the fields number specified must be separated by comma. Ranges are not described with -f option . cut uses tab as a default field delimiter but can also work with other delimiter by using -d option.
Note: Space is not considered as delimiter in UNIX.

$cut -d "delimiter" -f (field number) file.txt

Like in the file state.txt fields are separated by space if -d option is not used then it prints whole line:

$ cut -f 1 state.txt Andhra Pradesh Arunachal Pradesh Assam Bihar Chhattisgarh

If -d option is used then it considered space as a field separator or delimiter:

$ cut -d " " -f 1 state.txt Andhra Arunachal Assam Bihar Chhattisgarh Command prints field from first to fourth of each line from the file. Command: $ cut -d " " -f 1-4 state.txt Output: Andhra Pradesh Arunachal Pradesh Assam Bihar Chhattisgarh

4. –complement: As the name suggests it complement the output. This option can be used in the combination with other options either with -f or with -c .

$ cut --complement -d " " -f 1 state.txt Pradesh Pradesh Assam Bihar Chhattisgarh $ cut --complement -c 5 state.txt Andha Pradesh Arunchal Pradesh Assa Biha Chhatisgarh

5. –output-delimiter: By default the output delimiter is same as input delimiter that we specify in the cut with -d option. To change the output delimiter use the option –output-delimiter=”delimiter” .

$ cut -d " " -f 1,2 state.txt --output-delimiter="%" Andhra%Pradesh Arunachal%Pradesh Assam Bihar Chhattisgarh

Here cut command changes delimiter(%) in the standard output between the fields which is specified by using -f option .

6. –version: This option is used to display the version of cut which is currently running on your system.

$ 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.

Applications of cut Command

1. How to use tail with pipes(|): The cut command can be piped with many other commands of the unix. In the following example output of the cat command is given as input to the cut command with -f option to sort the state names coming from file state.txt in the reverse order.

$ cat state.txt | cut -d " " -f 1 | sort -r Chhattisgarh Bihar Assam Arunachal Andhra

It can also be piped with one or more filters for additional processing. Like in the following example, we are using cat, head and cut command and whose output is stored in the file name list.txt using directive(>).

$ cat state.txt | head -n 3 | cut -d " " -f 1 > list.txt $ cat list.txt Andhra Arunachal Assam

Thanks Saloni Gupta for providing more examples.