Шрифт:
Так, если вы желаете заменить первое двоеточие в файле /etc/passwd на символ %, а затем отправить результат в стандартный вывод, следует выполнить следующую команду:
$ sed 's/:/%/' /etc/passwd
Чтобы заменить все двоеточия в файле /etc/passwd, добавьте спецификатор g в конце операции, как здесь:
$ sed 's/:/%/g' /etc/passwd
Приведу команду, которая работает построчно; она считывает файл /etc/passwd и удаляет строки с третьей по шестую, а затем отправляет результат в стандартный вывод:
$ sed 3,6d /etc/passwd
В этом примере число 3,6 является адресом (диапазоном строк), а флаг d — операцией (удаление). Если адрес опустить, команда sed будет работать со всеми строками входного потока. Двумя самыми распространенными операциями команды sed являются s (найти и заменить) и d.
В качестве адреса можно также использовать регулярное выражение. Эта команда удаляет любую строку, которая соответствует регулярному выражению exp:
$ sed '/exp/d'
11.10.4. Команда xargs
Когда вам приходится запускать одну команду для большого количества файлов, то эта команда или оболочка может ответить, что она не способна вместить все аргументы в свой буфер. Чтобы справиться с этой проблемой, используйте команду xargs, запуская ее в стандартном потоке ввода для каждого имени файла.
Многие применяют команду xargs вместе с командой find. Например, следующий сценарий может помочь проверить, что в текущем каталоге каждый файл с расширением .gif действительно является изображением в формате GIF (Graphic Interchange Format, формат обмена графическими данными):
$ find .
– name '*.gif' -print | xargs file
В приведенном примере команда xargs запускает команду file. Однако такой вызов может привести к ошибкам или подвергнуть вашу систему рискам, связанным с безопасностью, поскольку имена файлов могут содержать пробелы и символы перевода строки. При написании сценариев используйте приводимую ниже форму, которая изменяет выходной разделитель команды find и разделитель аргументов команды xargs — вместо символа перевода строки применяется символ NULL:
$ find .
– name '*.gif' -print0 | xargs -0 file
Команда xargs запускает множество процессов, поэтому не ожидайте высокой производительности, если вы работаете с большим количеством файлов.
Может потребоваться добавить два дефиса (—) в конце команды xargs, если есть вероятность того, что название какого-либо целевого файла начинается с дефиса (-). Двойной дефис (—) можно применять, чтобы сообщить какой-либо команде, что аргументы, которые за ним следуют, являются именами файлов, а не параметрами. При этом помните, что не все команды поддерживают использование двойного дефиса.
Есть альтернатива команде xargs при применении команды find: параметр -exec. Однако ее синтаксис довольно мудреный, так как вам необходимо использовать символы {} для подстановки имени файла и литерал ;, чтобы указать окончание команды. Вот как выполняется предыдущая задача с помощью одной лишь команды find:
$ find .
– name '*.gif' -exec file {} \;
11.10.5. Команда expr
Если вам необходимо использовать арифметические операторы в сценариях оболочки, может прийти на помощь команда expr (которая выполняет даже некоторые операции со строками). Например, команда expr 1 + 2 выводит результат 3. Запустите команду expr -help, чтобы получить полный перечень операций.
Применение команды expr — это неуклюжий и медленный способ выполнения математических вычислений. Если вам часто приходится заниматься ими, то, вероятно, лучше использовать что-либо вроде языка Python вместо сценария оболочки.
11.10.6. Команда exec
Команда exec является встроенной в оболочку функцией, которая заменяет текущий процесс оболочки той командой, которую вы укажете после команды exec. Она осуществляет системный вызов exec, о котором вы узнали из главы 1. Эта функция предназначена для сохранения системных ресурсов, однако помните о ее необратимости: если запустить команду exec в сценарии оболочки, то этот сценарий и сама оболочка прекратят работу, уступив место новой команде.
Чтобы проверить это в окне оболочки, попробуйте запустить команду exec cat. После нажатия сочетания клавиш Ctrl+D или Ctrl+C для завершения команды cat окно оболочки должно исчезнуть, поскольку его дочерний процесс больше не существует.
11.11. Подоболочки
Предположим, вам необходимо немного изменить среду в оболочке, но это изменение не должно стать постоянным. Можно изменить, а потом вернуть в исходное состояние часть среды (например, путь или рабочий каталог), используя переменные оболочки, однако такой способ довольно груб. Простой вариант выполнения подобных задач заключается в применении подоболочки, совершенно нового процесса оболочки, который можно создать только для того, чтобы выполнить одну-две команды. Новая оболочка обладает копией среды исходной оболочки, и когда новая оболочка существует, любые изменения, которые будут сделаны в ее среде, не отразятся на обычной работе исходной оболочки.