Библиотека сайта 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>. |