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

author avatar
Text Writer

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

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