Истории успеха наших клиентов — лучшие проекты
Вход/ Регистрация

Команда sed в Linux: подробное руководство

109
7 минут чтения
Средний рейтинг статьи: 5

sed — один из самых мощных и популярных инструментов в Linux/Unix-системах для работы с текстом. Название утилиты расшифровывается как Stream EDitor (потоковый редактор), что отражает принцип ее работы: она читает текст построчно (из файла или конвейера), применяет заданные команды и выводит результат. sed идеально подходит для автоматизации и используется для редактирования конфигурационных файлов, при работе с лог-файлами, скриптами и любыми текстовыми данными.

Сегодня мы подробно рассмотрим синтаксис и особенности утилиты sed и применим ее на практике.

Облачные серверы

Масштабируемые вычислительные ресурсы
по всему миру с почасовой оплатой.

Принцип работы sed

  1. Читает одну строку из входного потока данных и передает ее в свой буфер шаблонов. Под потоком данных понимают файл или стандартный ввод (stdin).

  2. Последовательно применяет к строке указанные команды.

  3. Выводит содержимое буфера шаблонов.

  4. Переходит к следующей строке.

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

Синтаксис sed

Синтаксис утилиты sed следующий:

    

Рассмотрим на простом примере. Предположим, у нас есть файл new-file.txt, в котором указано три строки со словом «привет»:

    

Image8

Необходимо заменить все слова «привет» на «мир» и вывести результат на экран без изменения исходного файла. Для этого используем команду:

    

Image4

Расшифровка опций:

  • s — команда для замены.

  • 's/привет/мир/g' — строка с командой, которая производит замену. Состоит из нескольких частей:

    • s — команда для замены.

    • / — разделитель. Можно использовать любой другой символ.

    • привет — можно использовать как регулярные выражения, так и слова. Здесь мы указываем слово, которое хотим заменить.

    • мир —  строка замены. Здесь мы обозначаем, на что меняем.

    • 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

Для наглядности рассмотрим практические примеры использования утилиты sed. Устанавливать утилиту не надо — она уже автоматически предустановлена практически во всех современных дистрибутивах Linux\Unix.

Простая замена текста

Заменить все слова user на dev-user в файле main.txt:

    

Image10

Следующий пример аналогичен команде выше, но результат будет сохранен в новый файл с именем new-main.txt:

    

Image11

Заменить все слова "user" на "dev-user" в файле main.txt. При этом исходный файл main.txt будет перезаписан:

    

Image13

Заменить слово “user” на “dev-user” только во второй строке:

    

Image1

Заменить все слова «http» во всех строках на «https» и перезаписать изменения в исходном файле urls.txt:

    

Image3

Замена символов

Заменить все запятые на точки с запятой в файле data.csv:

    

Image14

Удаление строк и символов

Удалить все строки, которые начинаются с символа комментария #:

    

Image2

Удалить все пустые строки:

    

Image9

Удалить строки с пятой по десятую:

    

Image5

Удаление HTML-тегов

Предположим, у нас есть файл с HTML-страницей. Нам необходимо удалить все теги (символы <>):

    

Image6

Очистка лог-файла от IP-адресов

Представим ситуацию: вы работаете с лог-файлом доступа Nginx (access.log). В файл записываются IP-адреса источников, однако один и тот же IP-адрес может обращаться к нескольким ресурсам одновременно. Вам нужно подготовить отчет, предварительно удалив из файла все IP-адреса, а также символы - -, которые перечислены после каждого IP-адреса. Изменения необходимо записать в новый файл access_modified.log. Для этого используем команду:

    

Image7

Массовое редактирование конфигурационных файлов

Вы — системный администратор в компании-интеграторе и отвечаете за миграцию инфраструктуры. После переезда в нескольких десятках конфигурационных файлов с расширением .conf поменялся IP-адрес базы данных. Старый IP-адрес — 192.168.1.100 — необходимо заменить на новый 10.0.1.50. Воспользуемся следующей командой sed для решения задачи:

    

Image12

Обратите внимание, что мы экранировали символ точки (\.), так как в регулярных выражениях точка означает «любой символ».

Извлечение IP-адресов из лог-файлов

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

    

Image15

Подготовили для вас выгодные тарифы на облачные серверы

Cloud MSK 15

477 ₽/мес

Процессор
1 x 3.3 ГГц
Память
1 ГБ
NVMe
15 ГБ
Канал
1 Гбит/с
Публичный IP
Cloud MSK 30

657 ₽/мес

Процессор
1 x 3.3 ГГц
Память
2 ГБ
NVMe
30 ГБ
Канал
1 Гбит/с
Публичный IP

Заключение

Утилита sed — один из самых мощных инструментов в арсенале любого системного администратора, DevOps-инженера или просто продвинутого пользователя Linux/Unix-систем. Ее сила заключается в удивительной простоте синтаксиса при практически неограниченных возможностях, которые открываются при грамотном использовании регулярных выражений и комбинировании с другими утилитами командной строки.

Мы убедились, что sed способна решать задачи любого уровня сложности — от простой замены одного слова на другое до массового редактирования десятков и сотен конфигурационных файлов, очистки и трансформации логов, удаления HTML-тегов, извлечения нужных данных по сложным шаблонам и даже транслитерации символов. При этом процесс редактирования текста происходит мгновенно.

sed обладает ключевыми преимуществами:

  • Потоковая обработка — минимальное потребление памяти даже при работе с большими файлами.

  • Не меняет исходные файлы по умолчанию, что обеспечивает безопасность и сохраняемость исходных файлов.

  • Поддержка расширенных регулярных выражений (-E / -r) и мощных адресов (номера строк, шаблоны, диапазоны).

  • Простота автоматизации — sed легко встраивается в bash-скрипты и cron-файлы.

109
7 минут чтения
Средний рейтинг статьи: 5
Хотите внести свой вклад?
Участвуйте в нашей контент-программе за
вознаграждение или запросите нужную вам инструкцию
img-server