Linux: 10 примеров использования cut

Автор: | 13/11/2014

linux_logoВ примерах мы будем использовать такой файл:

$ cat test.txt
cat command for file oriented operations.
cp command for copy files or directories.
ls command to list out files and directories with its attributes.

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

Для получения определённых колонок используется опция -c. В следующем примере мы получим 2-ой символ (2 колонка) в каждой строке:

$ cut -c2 test.txt
a
p
s

2. Выборка колонок по символам с диапазоном значений

Диапазон символов можно получить, указав стартовую и конечную позицию символом “-“.

В следующем примере мы выделим символы с первого по третий в каждой строке:

$ cut -c1-3 test.txt
cat
cp
ls

3. Выборка колонок с использованием стартовой или конечной позиции

Начальная или последняя позиция могут задавать с помощью опции -c.

В следующем примере мы задаём только стартовую колонку, с которой начинать выборку, перед символом “-“. Мы получим все символы, начиная с 3-го:

$ cut -c3- test.txt
t command for file oriented operations.
 command for copy files or directories.
 command to list out files and directories with its attributes.

А в следующем примере – мы получим только первые 8 символов:

$ cut -c-8 test.txt
cat comm
cp comma
ls comma

4. Выборка указанных полей

Вместо указания количества символов, можно задать выборку по целым полям, используя опции -d и -f. Опция -f указывает поля, которые необходимо получить, а опция -d – разделитель, по которым необходимо осуществлять разделение полей.

В следующем примере мы отобразим только первое поле файла /etc/passwd, используя разделитель “:” (двоеточие):

$ cut -d':' -f1 /etc/passwd
root
daemon
bin
sys
sync
games
bala

5. Выборка различных полей

Вы так же можете осуществить выборку нескольких полей. В примере ниже будут выведены имена пользователей и домашние директории пользователей, у которых shell задан как /bin/bash:

$ grep "/bin/bash" /etc/passwd | cut -d':' -f1,6
root:/root
bala:/home/bala

Что бы отобразить диапазон полей – укажите начальное и последнее поле, как в примере ниже. Ниже мы осуществим выборку полей с 1 по 4, 6 и 7:

$ grep "/bin/bash" /etc/passwd | cut -d':' -f1-4,6,7
root:x:0:0:/root:/bin/bash
bala:x:1000:1000:/home/bala:/bin/bash

6. Выборка полей, если строка содержит разделитель

В нашем примере с /etc/passwd, если вы укажете разделитель отличный от “:” – вы получите целую строку.

В следующем примере мы укажем разделителем пайп (“|“), а утилита cut отобразит всю строку целиком, даже если такой разделитель не будет найден:

$ grep "/bin/bash" /etc/passwd | cut -d'|'  -f1
root:x:0:0:root:/root:/bin/bash
bala:x:1000:1000:bala,,,:/home/bala:/bin/bash

Однако, возможно отфильтровать строки, содержащие только разделитель, с использованием опции -s.

В следующем примере не будет показано ничего, так как -s отфильтрует строки, не содержащие разделитель “|“:

$ grep "/bin/bash" /etc/passwd | cut -d'|' -s -f1

7. Выборка всех полей, кроме заданных

Что бы использовать выборку по полям, кроме заданных – используйте опцию --complement.

В следующем примере вы выберем все поля, кроме поля 7:

$ grep "/bin/bash" /etc/passwd | cut -d':' --complement -s -f7
root:x:0:0:root:/root
bala:x:1000:1000:bala,,,:/home/bala

8. Изменение разделителя в отображении результата

По умолчанию – в результатах разделитель будет тот же, который использовался при выборке.

Что бы изменить разделитель – используйте опцию --output-delimiter.

В примере ниже – мы заменим разделитель “:” на “#“:

$ grep "/bin/bash" /etc/passwd | cut -d':'  -s -f1,6,7 --output-delimiter='#'
root#/root#/bin/bash
bala#/home/bala#/bin/bash

9. Заменить разделитель на символ новой строки

В следующем примере каждое поле в результатах вывода cut будет выведено в новой строке. Мы так же используем опцию --output-delimiter, но укажем ей параметр “n“:

$ grep bala /etc/passwd | cut -d':' -f1,6,7 --output-delimiter=$'n'
bala
/home/bala
/bin/bash

10. Комбинирование утилиты Cut с другими утилитами Unix

Все возможности утилиты cut могут проявится при её использовании с другими утилитами для обработки stdout.

В следующем примере мы отобразим только самую нужную информацию из вывода утилиты ps:

$ ps axu | grep python | sed 's/s+/ /g' | cut -d' ' -f2,11-
2231 /usr/bin/python /usr/lib/unity-lens-video/unity-lens-video
2311 /usr/bin/python /usr/lib/unity-scope-video-remote/unity-scope-video-remote
2414 /usr/bin/python /usr/lib/ubuntuone-client/ubuntuone-syncdaemon
2463 /usr/bin/python /usr/lib/system-service/system-service-d
3274 grep --color=auto python