Материал подготовлен командой Simple-Server для администраторов VPS и выделенных серверов. Команды и пути проверяйте на тестовой машине перед production.
Кратко о задаче
-
Читает одну строку из входного потока данных и передает ее в свой буфер шаблонов. Под потоком данных понимают файл или стандартный ввод (
stdin). -
Последовательно применяет к строке указанные команды.
-
Выводит содержимое буфера шаблонов.
-
Переходит к следующей строке.
Читает одну строку из входного потока данных и передает ее в свой буфер шаблонов. Под потоком данных понимают файл или стандартный ввод (stdin).
Последовательно применяет к строке указанные команды.
Выводит содержимое буфера шаблонов.
Переходит к следующей строке.
При этом по умолчанию sed не меняет содержимое исходного файла. Чтобы вносить изменения в исходный файл, необходимо явно указать опцию.
Синтаксис утилиты sed следующий:
sed [опции] 'команды' [имя_файла]Рассмотрим на простом примере. Предположим, у нас есть файл new-file.txt, в котором указано три строки со словом «привет»:
Необходимо заменить все слова «привет» на «мир» и вывести результат на экран без изменения исходного файла. Для этого используем команду:
sed 's/привет/мир/g' new-file.txt-
s— команда для замены. -
's/привет/мир/g'— строка с командой, которая производит замену. Состоит из нескольких частей:
* `s` — команда для замены.
* `/` — разделитель. Можно использовать любой другой символ.
* `привет` — можно использовать как регулярные выражения, так и слова. Здесь мы указываем слово, которое хотим заменить.
* `мир` — строка замены. Здесь мы обозначаем, на что меняем.
* `g` — отвечает за глобальную замену: заменяются все вхождения шаблона в каждой строке.new-file.txt— имя обрабатываемого файла.
's/привет/мир/g' — строка с командой, которая производит замену. Состоит из нескольких частей:
-
s— команда для замены. -
/— разделитель. Можно использовать любой другой символ. -
привет— можно использовать как регулярные выражения, так и слова. Здесь мы указываем слово, которое хотим заменить. -
мир— строка замены. Здесь мы обозначаем, на что меняем. -
g— отвечает за глобальную замену: заменяются все вхождения шаблона в каждой строке.
/ — разделитель. Можно использовать любой другой символ.
привет — можно использовать как регулярные выражения, так и слова. Здесь мы указываем слово, которое хотим заменить.
мир — строка замены. Здесь мы обозначаем, на что меняем.
g — отвечает за глобальную замену: заменяются все вхождения шаблона в каждой строке.
new-file.txt — имя обрабатываемого файла.
В таблице ниже приведены часто используемые команды утилиты sed. Более подробную информацию можно найти в официальной документации.
| Опция | Что делает | Пример команды |
|---|---|---|
s | Заменяет значение | sed 's/cat/dog/g' animals.txt |
| Заменяет все слова «cat» на слово «dog». Исходный файл изменен не будет. | ||
i | Заменяет значения в исходном файле | sed -i 's/cat/dog/g' animals.txt |
| Заменяет все слова «cat» на слово «dog». Исходный файл будет изменен. | ||
d | Удаляет строку | sed '/^\s*#/d' nginx.conf |
Удаляет все строки, начинающиеся с символа комментария #. Исходный файл изменен не будет. | ||
p | Выводит строки | sed -n '5,10p' list.txt |
| Выведет только строки, которые начинаются с 5 по 10. Исходный файл изменен не будет. | ||
a | Добавляет текст после строки | sed '/server /a\ allow all;' nginx.conf |
| Добавит новую строку со значением allow all после строки, где есть слово «server». Исходный файл изменен не будет. | ||
c | Заменяет всю строку | sed '3c# Эта третья строка теперь комментарий' config.txt |
| Третья строка будет заменена на новое значение: Эта третья строка теперь комментарий. Исходный файл изменен не будет. | ||
y | Заменяет символы | sed 'y/abc/ABC/' letters.txt |
| Меняет регистр букв abc на ABC. | ||
| Все остальные символы не будут затронуты. Исходный файл изменен не будет. | ||
= | Выводит номер строки | sed -n '$=' file2.txt |
| Выведет общее количество строк в файле. | ||
q | Выходит после выполнения команды | sed '10q' access.log |
| Выведет только первые 10 строк и завершит свое выполнение. | ||
w | Записывает строки в файл | sed -n '/ERROR/w errors.txt' auth.log |
| Ищет строки, содержащие слово «ERROR» в файле auth.log и записывает их в файл errors.txt. |
sed 's/cat/dog/g' animals.txt
Заменяет все слова «cat» на слово «dog». Исходный файл изменен не будет.
Заменяет значения в исходном файле
sed -i 's/cat/dog/g' animals.txt
Заменяет все слова «cat» на слово «dog». Исходный файл будет изменен.
sed '/^\s*#/d' nginx.conf
Удаляет все строки, начинающиеся с символа комментария #. Исходный файл изменен не будет.
sed -n '5,10p' list.txt
Выведет только строки, которые начинаются с 5 по 10. Исходный файл изменен не будет.
Добавляет текст после строки
sed '/server /a\ allow all;' nginx.conf
Добавит новую строку со значением allow all после строки, где есть слово «server». Исходный файл изменен не будет.
sed '3c# Эта третья строка теперь комментарий' config.txt
Третья строка будет заменена на новое значение: Эта третья строка теперь комментарий. Исходный файл изменен не будет.
sed 'y/abc/ABC/' letters.txt
Меняет регистр букв abc на ABC.
Все остальные символы не будут затронуты. Исходный файл изменен не будет.
sed -n '$=' file2.txt
Выведет общее количество строк в файле.
Выходит после выполнения команды
sed '10q' access.log
Выведет только первые 10 строк и завершит свое выполнение.
sed -n '/ERROR/w errors.txt' auth.log
Ищет строки, содержащие слово «ERROR» в файле auth.log и записывает их в файл errors.txt.
Практическое применение sed
Для наглядности рассмотрим практические примеры использования утилиты sed. Устанавливать утилиту не надо — она уже автоматически предустановлена практически во всех современных дистрибутивах Linux\Unix.
Заменить все слова user на dev-user в файле main.txt:
sed 's/user/dev-user/g' main.txtСледующий пример аналогичен команде выше, но результат будет сохранен в новый файл с именем new-main.txt:
sed 's/user/dev-user/g' main.txt > new-main.txtЗаменить все слова "user" на "dev-user" в файле main.txt. При этом исходный файл main.txt будет перезаписан:
sed -i 's/user/dev-user/g' main.txtЗаменить слово “user” на “dev-user” только во второй строке:
sed 's/user/dev-user/2' main.txtЗаменить все слова «http» во всех строках на «https» и перезаписать изменения в исходном файле urls.txt:
sed -i 's/http/https/g' urls.txtЗаменить все запятые на точки с запятой в файле data.csv:
sed -i 's/,/;/g' data.csvУдаление строк и символов
Удалить все строки, которые начинаются с символа комментария #:
Удалить все пустые строки:
Удалить строки с пятой по десятую:
Предположим, у нас есть файл с HTML-страницей. Нам необходимо удалить все теги (символы <>):
sed 's/<[^>]*>//g' index.htmlОчистка лог-файла от IP-адресов
Представим ситуацию: вы работаете с лог-файлом доступа Nginx (access.log). В файл записываются IP-адреса источников, однако один и тот же IP-адрес может обращаться к нескольким ресурсам одновременно. Вам нужно подготовить отчет, предварительно удалив из файла все IP-адреса, а также символы - -, которые перечислены после каждого IP-адреса. Изменения необходимо записать в новый файл access_modified.log. Для этого используем команду:
sed -E 's/([0-9]{1,3}\.){3}[0-9]{1,3} - - //g' access.log > access_modified.logМассовое редактирование конфигурационных файлов
Вы — администратор сервера в компании-интеграторе и отвечаете за миграцию инфраструктуры. После переезда в нескольких десятках конфигурационных файлов с расширением .conf поменялся IP-адрес базы данных. Старый IP-адрес — 192.168.1.100 — необходимо заменить на новый 10.0.1.50. Воспользуемся следующей командой sed для решения задачи:
find . -name "*.conf" -exec sed -i 's/192\.168\.1\.100/10.0.1.50/g' {} \;Обратите внимание, что мы экранировали символ точки (\.), так как в регулярных выражениях точка означает «любой символ».
Извлечение IP-адресов из лог-файлов
Вы администрируете веб-сервер Nginx. Служба безопасности просит вас прислать список IP-адресов пользователей, которые посещают ресурсы веб-сайта компании, для дальнейшего анализа. При помощи утилиты sed извлечем только уникальные IP-адреса и отсортируем их:
sed -E 's/^([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}).*/\1/' access.log | sort -u > ip_addresses.txtНужен сервер для практики? Арендуйте VPS/VDS в России — root-доступ, NVMe, DDoS-защита и поддержка 24/7.