Как использовать 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