Як змінювати конфігураційні файли у Linux за допомогою sed та awk?

Конфігураційні файли у Linux — це звичайний текст, який можна редагувати навіть у найпростішому редакторі. Але коли доводиться оновлювати десятки чи сотні файлів, відкривати кожен вручну в nano чи vim — це великі витрати часу.
Для автоматизації таких завдань стануть у пригоді дві потужні утиліти командного рядка — sed і awk. Вони допомагають швидко знаходити, змінювати й навіть видаляти потрібні параметри, не відкриваючи файли в інтерактивному режимі.
У цьому гайді розберемо, як за допомогою цих інструментів редагувати конфіги, додавати або видаляти параметри й навіть змінювати значення лише у певних секціях файлів.
Чому варто використовувати sed та awk для конфігів?
- Швидкість — можна змінити одразу десятки файлів однією командою.
- Автоматизація — легко додати у скрипти й виконувати за розкладом.
- Точність — зміни відбуваються лише там, де ти задав шаблон.
- Безпека — є можливість протестувати команду без реального збереження, щоб уникнути помилок.
Приклад 1: Заміна параметра у файлі за допомогою sed
Припустимо, потрібно змінити порт SSH з 22 на 2222 у файлі /etc/ssh/sshd_config, навіть якщо він закоментований:
sed -i 's/^#\?ListenPort.*/ListenPort 2222/' /etc/ssh/sshd_config
Що відбувається:
- -i — змінює файл «на місці» (in-place).
- ^#\? — знаходить рядки, які починаються з # або без нього.
- ListenPort.* — захоплює весь рядок із цим параметром.
- Решта команди замінює його на ListenPort 2222.
Приклад 2: Зміна параметра лише у певній секції
Ти маєш два файли конфігів із блоками loop: і хочеш увімкнути параметр enable лише в цій секції:
sed -i '/^loop:/,/^$/ { s/enable:.*$/enable: true/ }' file1.conf file2.conf
Пояснення:
- /^loop:/,/^$/ — обмежує дію команди блоком між loop: та пустим рядком.
- Усередині { … } відбувається заміна enable: на enable: true.
- Один рядок — і зміни одразу в обох файлах.
Приклад 3: Видалення параметра
Якщо в конфігу є рядок, який потрібно прибрати (наприклад, UseDNS у SSH), використовуй:
sed -i '/^UseDNS/d' /etc/ssh/sshd_config
- ^UseDNS — знаходить рядки, що починаються з цього параметра.
- d — видаляє їх.
Приклад 4: Витяг значення за допомогою awk
Щоб дізнатися значення параметра PermitRootLogin у SSH-конфігу:
Тут $1 — перше слово в рядку, $2 — друге. Якщо перше дорівнює PermitRootLogin, виводимо друге.
Приклад 5: Додавання нового параметра після іншого
Хочеш після PermitRootLogin вставити новий рядок Banner /etc/issue.net?
sed -i '/^PermitRootLogin/a Banner /etc/issue.net' /etc/ssh/sshd_config
- a — додає новий рядок після збігу.
Поетапно: як змінювати конфіги без помилок
- Створи резервну копію
cp file.conf file.conf.bak
- Перевір команду без змін. Видали -i та подивись на виведення у терміналі.
- Використовуй чіткі шаблони, щоб не змінити зайві місця.
- Тестуй на одному файлі, перш ніж запускати на десятках.
- Додавай у скрипти, щоб автоматизувати рутинні зміни.
Приклад: масова зміна параметра у багатьох конфігах
Сценарій: потрібно оновити значення MaxConnections у всіх .conf файлах у каталозі /etc/myapp/.
#!/bin/bash
NEW_VALUE=500
for file in /etc/myapp/*.conf; do
if awk '$1 == "MaxConnections"' "$file" > /dev/null; then
sed -i 's/^MaxConnections.*/MaxConnections '"$NEW_VALUE"'/' "$file"
echo "Updated MaxConnections in $file"
else
echo "MaxConnections $NEW_VALUE" >> "$file"
echo "Added MaxConnections to $file"
fi
done
Скрипт перевіряє, чи є параметр у файлі. Якщо є — оновлює, якщо ні — додає в кінець.
Підсумок
sed і awk — це інструменти, які економлять час і зменшують ризик помилок під час роботи з конфігами. Вони особливо корисні, коли потрібно змінити одні й ті ж параметри у багатьох файлах або виконати зміни лише у певних секціях.
Чим раніше ти почнеш їх використовувати в роботі, тим швидше звикнеш до автоматизованого підходу й забудеш про нудне ручне редагування.
Опанував базу, але відчуваєш, що це лише верхівка айсберга? Настав час прокачати скіли на курсах Linux від ITEDU.