<div><img src="https://top-fwz1.mail.ru/counter?id=3548135;js=na" style="position:absolute;left:-9999px;" alt="Top.Mail.Ru" /></div>
Истории успеха наших клиентов — лучшие проекты
Вход / Регистрация

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

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

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

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

cloud

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

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

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

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

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

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

Синтаксис sed

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

sed [опции] 'команды' [имя_файла]

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

cat new-file.txt

Image8

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

sed 's/привет/мир/g' new-file.txt

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:

sed 's/user/dev-user/g' main.txt

Image10

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

sed 's/user/dev-user/g' main.txt > new-main.txt

Image11

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

sed -i 's/user/dev-user/g' main.txt

Image13

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

sed 's/user/dev-user/2' main.txt 

Image1

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

sed -i 's/http/https/g' urls.txt

Image3

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

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

sed -i 's/,/;/g' data.csv

Image14

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

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

sed '/^#/d' config.conf

Image2

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

sed '/^$/d' file.txt

Image9

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

sed '5,10d' file.txt

Image5

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

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

sed 's/<[^>]*>//g' index.html

Image6

Очистка лог-файла от 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

Image7

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

Вы — системный администратор в компании-интеграторе и отвечаете за миграцию инфраструктуры. После переезда в нескольких десятках конфигурационных файлов с расширением .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' {} \;

Image12

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

Извлечение 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

Image15

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

Заключение

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

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

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

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

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

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

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

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