Редактирование без редактора: утилиты командной строки

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

Предположим, что нам требуется добавить в файл /etc/fstab строку вроде

tmpfs	/tmp	tmpfs	defaults,noatime	0 0

Зачем? На этот вопрос мы ответим, когда займёмся собственно конфигурированием. А пока ответим на вопрос -- как? Очень просто -- с помощью банальной команды cat:

# cat - >> /etc/fstab

Здесь символ дефиса (-) означает, что входящие данные будут получены со стандартного ввода (то есть, попросту говоря, с клавиатуры), удвоенный символ перенаправления (-) -- что они будут присоединены к имеющемуся файлу /etc/fstab.

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

$ su

или

$ sudo -i

Обращаю особое внимание на то, что просто предварить команду cat командой sudo будет недостаточно: её действие не распространится на действия после перенаправления (спасибо Rootlexx'у за поминание этого важного момента).

После ввода указанной команды и нажатия клавиши Enter перед нами возникнет пустая строка, в которую и следует ввести указанную последовательность символов, после чего повторно нажать Enter, а затем клавишную комбинацию Control+D, знаменующую конец файла.

Всё, теперь, просмотрев наш файл, например, таким образом

$ less /etc/fstab

можно убедиться, что необходимая строка в конце его появилась, а сам файл заканчивается символом перевода каретки -- /etc/fstab ругается на его отсутствие (хотя исполнять свои обязанности не отказывается).

Вообще-то функции команды cat не исчерпываются рассмотренным примером. Она служит и для вывода файла на экран, и, как было сказано ранее http://fossbook.info/subproj/fedorabook/655, для объединения нескольких файлов воедино (причём не обязательно текстовых), и даже для создания небольших документов. Но об этом мы поговорим в другом месте.

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

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

В самом общем виде sed требует двух аргументов -- указания встроенной его команды и имени файла, к которому она должны быть применена. кроме того, не возбраняется и использование опций. Так, современные версии sed имеют очень полезную опцию -i, указание которой внесёт изменения непосредственно в обрабатываемый файл. Так что в нашем случае она оказывается практически обязательной -- без неё sed просто отобразит результаты своей работы на стандартном выводе (то есть дисплее), не зафиксировав результат редактирования в файле-аргументе.

Сказанное легко проиллюстрировать на практическом примере. В Fedora для работы с видеокартами Nvidia ныне по умолчанию используется свободный драйвер nouveau, функциональность которого пока далека от совершенства. А с некоторыми видеочипами (например, с тем, что входит в так называемую платформу ION) он работать просто отказывается. Так что насущной необходимостью оказывается установка драйвера фирменного.

Как она производится -- будет рассказано на соответствующей странице. А в рамках нашей сегодняшней темы достаточно сказать, что по окончании этой процедуры из системы необходимо выключить поддержку старого драйвера. Для чего в конфиг загрузчика, /boot/grub/grub.conf, в ту его строку, что описывает параметры загрузки ядра, надо добавить дополнительный параметр, rdblacklist=nouveau.

С помощью sed эта задача решается так:

$ sudo sed -i '/root=/s|$| rdblacklist=nouveau|' /boot/grub/grub.conf

Здесь -i -- та самая опция перезаписи редактируемого файла, о которой говорилось чуть ранее, выражение /root= указывает, что работа будет производиться со строкой, начинающейся этой последовательностью, /s -- собственно команда редактора, предписывающая заменить конец строки (символизируемый баксом, $)требуемым параметром rdblacklist=nouveau, а /boot/grub/grub.conf -- имя редактируемого файла. Символы же | служат для разделения команд и аргументов. В этом качестве не обязательно использовать именно | -- может применяться прямой слэш, тильда и другие спецсимволы.

Обращаем также внимание не то, что встроенная команда sed'а вместе с её аргументами экранируется одинарными (то есть "строгими") кавычками.

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

$ sed -i 's|что_заменить|чем_заменить|' filename

Если мы вернёмся к файлу /etc/fstab, то уидим там строку вида

tmpfs	/dev/shm	tmpfs	defaults,noatime	0 0

Открою страшную тайну: каталог /dev/shm как точка монтирования файловой системы tmpfs предусмотрен стандартом POSIX, но на самом деле нафиг не нужен, так как ни одной программой не используется.

Так что строку эту резонно заменить приведённой ранее, описывающей монтирование tmpfs в каталог /tmp, что реально полезно во многих случаях. Что и проделываем таким образом:

$ sudo sed -i
'|s|tmpfs	/dev/shm	tmpfs	defaults,noatime	0 0|
tmpfs	/tmp	tmpfs	defaults,noatime	0 0|'
 /etc/fstab

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

Я привел лишь элементарные примеры использования sed для ускоспециализированных задач. На самом деле возможности его много шире. В частности, он обеспечивает массовую замену одних последовательностей символов другими сразу во множестве файлов -- например, при изменении абсолютной адресации ссылок на сайте, смене адреса электронной почты веб-мастера и так далее. Во всем блексе sed показывает себя при редактировании очень больших файлов (одно пролистывание которых требует немалого времени). Однако всё это -- совсем другая история.


Главная
Содержание

. .