Як змінювати конфігураційні файли у 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 — додає новий рядок після збігу.

Поетапно: як змінювати конфіги без помилок

  1. Створи резервну копію
cp file.conf file.conf.bak
  1. Перевір команду без змін. Видали -i та подивись на виведення у терміналі.
  2. Використовуй чіткі шаблони, щоб не змінити зайві місця.
  3. Тестуй на одному файлі, перш ніж запускати на десятках.
  4. Додавай у скрипти, щоб автоматизувати рутинні зміни.

Приклад: масова зміна параметра у багатьох конфігах

Сценарій: потрібно оновити значення 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.

Залишити відповідь

Дякуємо, що поділились