Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

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

Оригинал: Learning Linux Commands: cut
Автор: Rares Aioanei
Дата публикации: 5 января 2012 года
Перевод: А. Кривошей
Дата публикации перевода: 2 ноября 2012 г.

1. Введение

Если вы думаете, что можете администрировать Linux без использования команды cut, то вы совершенно правы. Однако владение этой очень простой утилитой командной строки даст вам определенные преимущества, так как позволит повысить эффективность своей работы. Проще говоря, cut - это одна из многих утилит для фильтрации текста, предлагаемых операционной системой Linux. Она фильтрует STDIN из другой команды или из файла и отправляет фильтрованный вывод в STDOUT.

2. Часто используемые опции

Давайте без долгих предисловий перейдем сразу к делу и изучим наиболее часто используемые опции командной строки.

-b, --bytes=LIST
выбрать из файла только заданные байты согласно списку
-c, --characters=LIST
выбрать из файла заданные символы согласно списку
-f, --fields=LIST
выбирает только поля, перечисленные в списке. Разделителем по умолчанию служит TAB. Значение по умолчанию может быть переопределено с помощью опции -d.
-d, --delimiter=DELIMITER
Позволяет задать разделитель полей. Как уже говорилось выше, значением по умолчанию является TAB, но эта опция позволяет переопределить его.

3. Использование списков

Список (list) в данном случае может состоять из одного или набора байтов, символов или полей. Например, для вывода только второго байта список будет включать единственное число 2.
Поэтому:

2 - будет выведен только второй байт, символ или поле, считая с первого.
2-5 - будут выведены все байты, символы и поля со второго по пятый.
-3 - будут выведены все байты, символы и поля до четвертого.
5- - будут выведены все байты, символы или поля, начиная с пятого.
1,3,6 - будут выведены только первый, третий и шестой байты, символы или поля.
1,3- - будут выведены первый и все байты, символы или поля, начиная с третьего.

4. Выборка по символам

Приведенные ниже примеры говорят сами за себя. Мы использовали опцию -c, чтобы выводить только заданный диапазон символов из файла cut.txt.

echo cut-command > cut.txt 
$ cut -c 2 cut.txt 
u
$ cut -c -3 cut.txt
cut
$ cut -c 2-5 cut.txt
ut-c
$ cut -c 5- cut.txt
command

5. Выборка по байтам

Приницип работы опции -b (побайтно) похож на описанный выше для работы с символами. Мы знаем, что один символ имеет размер 1 байт, поэтому результат выполнения команды с опцией -b будет тот же самый.

$ cut -b 2 cut.txt
u
$ cut -b -3 cut.txt
cut
$ cut -b 2-5 cut.txt
ut-c
$ cut -b 5- cut.txt
command

cut.txt - это простой текстовый файл в кодировке ASCII. Различия будут заметны только при использовании многобайтных кодировок, таких как UTF-8 Unicode. Например:

$ echo Lubos > cut.txt
$ file cut.txt 
cut.txt: UTF-8 Unicode text
$ cut -b 1-3 cut.txt 
Lu
$ cut -c 1-3 cut.txt 
Lub

6. Выборка по полям

Как уже говорилось ранее, поле, используемое командной cut по умолчанию - это TAB. Например, создадим файл, где общим разделителем является TAB.
Подсказка: если вы не знаете, как вставить TAB в командной строке, используйте комбинацию клавиш CTRL + V, перед тем, как нажать TAB.

$ echo "1        2       3" > cut.txt 
$ echo "4        5       6" >> cut.txt 
$ cat cut.txt 
1       2       3
4       5       6
$ cut -f2- cut.txt 
2       3
5       6

В примере выше были выведены только второй и третий столбцы, потому что TAB является общим разделителем и в то же время используется командной cut как поле по умолчанию. Убедиться в том, что вы использовали TAB вместо пробела можно с помощью команды od:

$ echo "1        2" > tab.txt
$ echo "1        2" > space.txt
$ od -a tab.txt 
0000000   1  ht   2  nl
0000004
$ od -a space.txt 
0000000   1  sp  sp  sp  sp  sp  sp  sp  sp   2  nl
0000013

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

$ echo 1-2-3-4 > cut.txt 
$ echo 5-6-7-8 >> cut.txt 
$ cat cut.txt 
1-2-3-4
5-6-7-8
$ cut -d - -f-2,4 cut.txt 
1-2-4
5-6-8

Классический пример, где нам необходимо использовать опцию -d, чтобы извлечь список пользователей текущей системы из файла /etc/passwd.

$ cut -d : -f 1 /etc/passwd
root
daemon
bin
sys
sync
games
man
lp
mail
news
uucp
proxy
www-data
...

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

$ cat cut.txt 
cut command
w   command
awk command
wc  command
$ cut -d " " -f2 cut.txt 
command

command

В этом случае было бы намного проще воспользоваться командой awk или sed, чтобы сначала заменить множественные пробелы на единый разделитель, например запятую.

$ sed 's/\s\+/,/' cut.txt | cut -d , -f2
command
command
command
command
$ awk '{ print $2; }' cut.txt 
command
command
command
command

7. Исключение данных с помощью complement

Команда cut позволяет вам выборочно включать требуемые данные в вывод. В случае, если вам необходимо выбрать данные для их исключения из вывода, очень полезна опция complement.
Пример:

$ echo 12345678 > cut.txt 
$ cat cut.txt 
12345678
$ cut --complement -c -2,4,6- cut.txt 
35

8. Примеры

Синтаксис команды Описание
free | grep Mem | sed 's/\s\+/,/g' | cut -d , -f2
Показывает объем памяти текущей системы
cat /proc/cpuinfo | grep "name" | cut -d : -f2 | uniq
Возвращает тип CPU
wget -q -O X http://ipchicken.com/
grep '^ \{8\}[0-9]' X | sed 's/\s\+/,/g' | cut -d , -f2
Возвращает мой внешний IP-адрес
cut -d : -f 1 /etc/passwd
Извлекает список пользователей текущей системы
ifconfig eth0 | grep HWaddr | cut -d " " -f 11
Получает MAC-адрес моих сетевых интерфейсов
who | cut -d \s -f1
Вывод список пользователей, авторизованных в текущей системе
grep -w  <n> /etc/services | cut -f 1 | uniq
Показывает, какая служба использует порт <n>.