Как использовать sed и awk для изменения конфигурационных файлов в Linux

Файлы конфигурации Linux часто представляют собой обычный текст, поэтому их легко редактировать с помощью инструментов командной строки. Среди наиболее мощных из них — sed и awk.
В то время как новички могут полагаться на ручное редактирование с помощью vi или nano, опытные системные администраторы часто обращаются к этим инструментам для автоматического анализа и перезаписи файлов конфигурации.
Эти инструменты позволяют сопоставлять шаблоны, извлекать поля и даже вносить изменения в файлы конфигурации в режиме реального времени — и всё это из командной строки или скриптов.
В этой статье мы рассмотрим, как использовать sed и awk для эффективного чтения, анализа и перезаписи конфигурационных файлов. Мы приведём практические примеры, которые помогут автоматизировать такие утомительные задачи, как обновление IP-адресов, изменение параметров или извлечение значений.
Давайте начнём с простого примера: замены параметра конфигурации с помощью sed.
Пример 1. Обновление параметра с помощью команды sed
Предположим, вы хотите обновить директиву ListenPort в файле конфигурации, например /etc/ssh/sshd_config, с помощью следующей команды:
sed -i 's/^#\?ListenPort.*/ListenPort 2222/' /etc/ssh/sshd_config
Вот что это делает:
-iв командеsedпозволяет редактировать файл на месте.^#\?соответствует строкам, которые могут начинаться, а могут и не начинаться с комментария (#).ListenPort.*соответствует остальной части строки, будь то значение по умолчанию или пользовательское значение.- Вся строка заменяется на
ListenPort 2222.
Такой подход подтверждает, что даже если директива закомментирована или уже имеет другое значение, она будет обновлена без изменений.
Пример 2. Извлечение значений с помощью команды awk
Для извлечения определённых значений из файла конфигурации отлично подходит awk. Например, если вы хотите получить значение директивы PermitRootLogin из файла конфигурации SSH, используйте:
awk '$1 == "PermitRootLogin" { print $2 }' /etc/ssh/sshd_config
Вот что это делает:
$1 == "PermitRootLogin"соответствует строкам, в которых первое поле точно равноPermitRootLogin.{ print $2 }выводит на экран второе поле, которое является фактическим значением, присвоенным этой директиве.
Эта команда просматривает файл в поисках строки, начинающейся с PermitRootLogin, и выводит соответствующее значение, обычно yes, no, или prohibit-password.
Пример 3. Удаление строки с параметрами с помощью команды sed
Например, если вам нужно удалить любую строку, начинающуюся с UseDNS в файле /etc/ssh/sshd_config, вы можете сделать это быстро и эффективно с помощью команды sed .
sed -i '/^UseDNS/d' /etc/ssh/sshd_config
Что это делает:
^UseDNSсоответствует строкам, которые начинаются с UseDNS.dв командеsedуказывает удалить эти строки.- Флаг
-iприменяет изменения непосредственно к файлу.
Это удобно, когда устаревшая или ненужная конфигурация присутствует в нескольких местах и вы хотите её удалить.
Пример 4. Создание отчёта с помощью команды awk
Предположим, у вас есть собственный файл конфигурации, в котором перечислены службы и их статус, например:
apache2 running mysql stopped nginx running ssh running
С помощью awk можно быстро составить список всех запущенных в данный момент служб.
awk '$2 == "running" { print $1 }' /etc/myapp/services.conf
Вот что он делает:
$2 == "running"соответствует строкам, в которых второе поле — «running».{ print $1 }выводит имя службы.
В результате будет выведен список только тех служб, которые запущены в данный момент. Вы можете расширить его, добавив счетчики или сохранив вывод в файл журнала для сценариев мониторинга.
Пример 5. Вставка строки до или после совпадения с помощью sed
Если вам нужно добавить новую строку после определённой директивы в файле конфигурации, используйте sed следующим образом:
sed -i '/^PermitRootLogin/a Banner /etc/issue.net' /etc/ssh/sshd_config
Вот что он делает:
/^PermitRootLogin/соответствует строке, содержащейPermitRootLogin.aдобавляет строку после совпадения.- Баннер
/etc/issue.net— это вставляемая строка.
Это удобно, когда нужно логически сгруппировать связанные параметры конфигурации.
Бонус: объединение awk и sed в сценариях командной оболочки
Опытные пользователи могут комбинировать awk и sed в bash-скриптах для автоматизации массовых задач по настройке. Например, можно проанализировать все файлы с расширением .conf в каталоге и перезаписать определенный параметр в каждом файле — например, обновить директиву MaxConnections до нового значения.
Вот простой скрипт, который делает именно это:
#!/bin/bash # Определите новое значение параметра NEW_VALUE=500 # Просмотрите все файлы .conf в /etc/myapp/ for file in /etc/myapp/*.conf; do # Проверьте, содержит ли файл директиву MaxConnections if awk '$1 == "MaxConnections"' "$file" > /dev/null; then # Используйте sed для замены существующего значения sed -i 's/^MaxConnections.*/MaxConnections '"$NEW_VALUE"'/' "$file" echo "Обновлено значение MaxConnections в $file" else # Если директива не существует, добавьте её в конец echo "MaxConnections $NEW_VALUE" >> "$file" echo "Добавлено MaxConnections в $file" fi done
Вот что делает этот скрипт:
NEW_VALUEдля сохранения обновлённого значения параметра.- Он перебирает все
.confфайлы в каталоге/etc/myapp/. awkпроверяет, существует ли уже директиваMaxConnections.- Если оно существует,
sedобновляет значение на месте. - Если нет, директива добавляется в конец файла.
Такой скрипт невероятно полезен для управления большими средами, в которых требуется согласованное обновление нескольких конфигурационных файлов без необходимости редактировать каждый из них вручную.
Выводы
И sed и awk — незаменимые инструменты для администраторов Linux, управляющих масштабными системами. Освоив их, вы сможете избежать повторяющихся ручных правок и обеспечить надёжность и воспроизводимость изменений в конфигурации.
Редактор: AndreyEx