Рейтинг@Mail.ru

Наши друзья и партнеры

UnixForum
купить дешевый 
компьютер родом из Dhgate.com




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

Дополнительные инструменты системного администратора из пакета Moreutils

Оригинал: Moreutils For Your Linux Shell Tool Set
Автор: Paul Brown
Дата публикации: 4 октября 2016 г.
Перевод: А.Панин
Дата перевода: 16 января 2017 г.

Дополнительные инструменты системного администратора из пакета Moreutils

Пакет Moreutils содержит новые инструменты, которые не входят в комплект поставки дистрибутивов Linux, но, скорее всего, заслуживают этого.

У меня есть испаноязычный вариант полезной книги Стивена Коффина под названием "Unix System V Release 4: The Complete Reference". Я могу поспорить на последний доллар, что если вы откроете любую из ее 700+ страниц и попробуете исполнить приведенные на ней команды в современном дистрибутиве Linux, они будут корректно работать. Ну, конечно же, исключением будут команды, предназначенные для работы с телетайпами и ленточными накопителями.

Исходя из всего вышесказанного, вы можете подумать, что интерфейс командной строки *NIX практически не изменялся с начала 1990-х годов. Это не совсем верно.

В качестве примера можно рассмотреть коллекцию утилит Moreutils. Вы можете установить ее в большинстве дистрибутивов Linux с помощью стандартного менеджера пакетов программного обеспечения. В дистрибутиве Ubuntu, а также основанных на Ubuntu дистрибутивах для этого достаточно выполнить команду:

sudo apt install moreutils

В дистрибутиве Debian для этой цели лучше использовать следующую последовательность команд:

su
apt-get install moreutils

В дистрибутиве Fedora может использоваться следующая команда:

yum install moreutils

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

Новые инструменты

Пакет Moreutils предоставляет в ваше распоряжение набор новых инструментов, которые не входят в комплект поставки дистрибутивов Linux, но, скорее всего, заслуживают этого. К примеру, утилита vidir позволяет редактировать содержимое директорий и переименовывать файлы с помощью интерфейса текстового редактора. Несмотря на название, утилита vidir позволяет работать с любым выбранным пользователем текстовым редактором, поэтому в том случае, если вы выбрали vi(m), то, она, конечно же, предложит использовать интерфейс vim (Рисунок 1); но если вы выбрали nano или emacs, она предложит использовать интерфейс nano или emacs (Рисунок 2).

Утилита vim предлагает использовать интерфейс выбранного пользователем текстового редактора, будь то vim(m)...

Рисунок 1. Утилита vidir предлагает использовать интерфейс выбранного пользователем текстового редактора, будь то vim(m)...

nano или любой другой текстовый редактор

Рисунок 2: ...или nano или любой другой текстовый редактор

Вы можете изменить содержимое директории с помощью команды:

vidir ИМЯ_ДИРЕКТОРИИ

Или изменить имена файлов из определенного набора с помощью аналогичной команды:

find Pictures -iname "*.png" | vidir -

Обратите внимание на символ "-". Он сообщает утилите vidir о том, что следует читать входные данные из программного канала.

Вы можете использовать обычные комбинации клавиш текстового редактора для модификации содержимого директорий и переименования файлов. Если вы работаете с интерфейсом текстового редактора vi, вы можете использовать клавишу i для изменения имен файлов или директорий; команду d[номер_файла]d для удаления файлов или директорий - при этом вы должны помнить о том, что vidir имеет встроенный механизм защиты, не позволяющий удалять непустые директории; клавишу u для отмены изменений и так далее.

Чтение всех данных: sponge

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

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

Вы должны сохранить его под именем knights.txt.

Что бы вы сделали, если бы вам понадобилось отсортировать строки из файла в алфавитном порядке? Вы наверняка попытались бы воспользоваться аналогичной командой:

sort knights.txt > knights_sorted.txt; rm knights.txt; mv knights_sorted.txt knights.txt

Ведь если бы вы использовали следующую команду:

sort knights.txt > knights.txt

вы осуществили бы перезапись содержимого исходного файла перед завершением операции чтения данных из него, уничтожив тем самым часть исходных данных. По этой причине и приходится задействовать промежуточный файл с именем knights_sorted.txt. Также вам придется сохранять исходный файл и удалять его лишь перед самым переименованием результирующего файла, что еще больше усложнит команду. Однако, благодаря существованию утилиты sponge, вы можете воспользоваться следующей командой:

sort knights.txt | sponge knight.txt

Обратите внимание: здесь вообще не используется промежуточный файл!

Благодаря существованию утилиты sponge вы можете читать содержимое текстового файла и осуществлять обработку его содержимого с помощью цепочки таких утилит, как sort, unique, sed, grep и tr. Утилита sponge будет самостоятельно читать все данные из файла, дожидаться окончания процесса их обработки, после чего записывать все результирующие данные обратно в файл.

В ходе разговора о данной утилите просто нельзя не упомянуть об утилите pee. Несмотря на ее имя, она не имеет ничего общего с биологическими жидкостями. Фактически ее имя является комбинацией слов pipe (программный канал, использующийся для передачи вывода одной команды на вход другой в системах *NIX) и tee (стандартная для *NIX утилита с интерфейсом командной строки).

В отличие от утилиты tee, перенаправляющей вывод команд в файлы (команда cat knights.txt | tee k1 k2 k3 позволяет создать файлы с именами k1, k2 и k3, содержащие данные из файла knights.txt), утилита pee организует программные каналы для передачи данных на входы команд из переданного списка:

В приведенном выше примере оригинальное неупорядоченное содержимое файла knights.txt передается сначала утилите sort для упорядочивания, после чего утилите wc (word count), которая при использовании параметра -l осуществляет подсчет количества строк (13) и, наконец, утилите grep, которая использует простое регулярное выражение для вывода лишь тех строк, которые начинаются с заглавной буквы "G".

Программные каналы

Если вы хотите вернуться к текстовым редакторам и при этом использовать программные каналы для передачи данных туда и обратно, вам следует обратить внимание на утилиту vipe. И снова, данная утилита будет использовать выбранный вами текстовый редактор с интерфейсом командной строки. Поместите данную утилиту в конвейер и выполните получившуюся команду; в результате откроется текстовый редактор с выводом предыдущих команд, который может быть отредактирован в соответствии с вашими предпочтениями. Например, при исполнении команды:

cat knights.txt | pee sort "wc -l" "grep - -e ^G.*" | vipe | unique

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

Круто, не так ли?

Пакет Moreutils содержит много других полезных инструментов...

В пакете Moreutils находится огромное количество других полезных инструментов. Утилита combine объединяет строки из двух файлов в соответствии с указанной логической операцией; ts добавляет переданную пользователем, читаемую человеком метку времени к каждой строке файла; ifdata максимально упрощает получение данных от сетевого интерфейса, что очень удобно для создания сценариев и так далее. Обратитесь к веб-странице проекта и страницам руководств каждой из утилит для того, чтобы разобраться, как они работают.

Хотя и сложно поспорить с тем, что поведение рассматриваемых утилит может повторяться путем создания сложных команд, такие инструменты, как sponge, pee и vipe значительно упрощают работу с командной оболочкой и делают ее более приятной.

Пакет Moreutils постоянно эволюционирует; время от времени разработчики добавляют в него новые инструменты. Лично мне интересно следить за тем, какие инструменты будут добавлены в этот пакет в будущем.


Если вам понравилась статья, поделитесь ею с друзьями: