Відредагуйте файл за допомогою bash script


12

Я початківець у програмі bash scripting. Я хочу створити bash-скрипт для автоматичного встановлення та налаштування матеріалів на моєму linux box.

Припустимо, я хочу редагувати

/etc/yum.repos.d/epel.repo

за сценарієм bash

Що я хочу зробити, це наступне

  1. Відкрити файл /etc/yum.repos.d/epel.repo
  2. Знайдіть розділ [epel]
  3. Додайте пріоритет рядка = 10 після ввімкнення рядка = 1 у розділі epel

Для першої частини я додав

yum install nano
nano /etc/yum.repos.d/epel.repo

Моє запитання - як зробити 2-ю та 3-ю частини за допомогою скрипту bash, використовуючи nano (якщо можливо, у випадку, якщо це неможливо, покажіть мені sed)

Також у деяких моментах мені доведеться змінювати змінні у файлах Наприклад, наприклад

  1. enable = 0 включити = 1
  2. Тестування = "1" до Тестування = "0"
  3. Додайте текст у рядку. function = to function = "text1", "text2"
  4. Додайте текст у файл і збережіть його (з nano)

Я знаю його вимогливість, але мені потрібно створити це для друга, який є noob в управлінні сервером. На жаль, я не встигаю вивчити сценарій bash з самого початку, як іспити, як близько. Я буду використовувати ваші приклади для написання сценарію.


Хлопці дякую за всі відповіді, які я успішно зробив більшу частину сценарію bash

Однак у мене є інша проблема Давайте припустимо , що я хочу змінити nginx.conf з використанням СЕД Ми будемо мати справу з worker_processes
Тепер я хочу використовувати СЕД зробити наступне 1.Find на перше входження в worker_processes в цій конф і заміна текстуworker_processes 4;

Тут особлива примітка. Це лише приклад. Може трапитися так, що конф містить radnik_process 1; . Це важка частина. Я хочу команду sed, яка знайде випадок ПЕРШОГО відповідності WHOLE слова " робочий_процес" , видалить рядок тексту, де знайдено слово, і вставте worker_processes 4;туди, а потім збережіть файл. Це найнадійніший метод, який я використовую при редагуванні файлів (без найвищого ризику зламати конф

Останньою пропозицією я скористався sed -i 's / enable = 0 / enable = 1 / g' /etc/yum.repos.d/remi.repo, щоб змінити увімкнено = 0 на увімкнено = 1 у розділі [remi] у ремі .repo. Хоча у мене є відчуття, що він може змінити всі включені = 0 у цьому файлі, що розірве сервер. Може хто-небудь запропонує кращий код.


Інший матеріал, в якому я не впевнений: PI хочу редагувати файл, у якому це тест як Text Testing = "0" (Так, у нього є лапки, і мені потрібно зберегти його) Це повинно бути змінено з Testing = "0" на Testing = " 1 "(з цитатами)

Також мені потрібно додати трохи тексту з цитатами в кінці файлу з sed На кшталт "Дякую Quanta" (з цитатою) Для php ви ставите \ з лунаючими цитатами, не знаю, як це робиться для bash

Інша річ, що
мені потрібно змінити рядок у конф., Але я не пам'ятаю, який текст замінюється

Як його слухати = щось; , я хочу змінити його для прослуховування = /tmp/php5-fpm.sock;

Великі великі пальці вгору для збільшення квантів

Дякуємо за чудову підтримку хлопців

Відповіді:


18
sed '/enabled=1/a\priority=10' /etc/yum.repos.d/epel.repo

Укажіть опцію редагування на місці ( -i), якщо ви хочете ( .bakспочатку робить резервну копію з розширенням):

sed -i.bak '/enabled=1/a\priority=10' /etc/yum.repos.d/epel.repo

Тепер я хочу використовувати sed, щоб зробити наступне 1.Знайдіть ПЕРШЕ виникнення Working_proces в цій конф і замініть текст на worker_process 4;

sed '0,/worker_processes [0-9]*;/s//worker_processes 4;/' /etc/nginx/nginx.conf

Остання пропозиція , яке я використовував sed -i 's/enabled=0/enabled=1/g' /etc/yum.repos.d/remi.repoдля зміни enabled=0в enabled=1рамках [remi]розділу в remi.repo. Однак у мене є відчуття, що він може змінити все enabled=0в цьому файлі, що розіб'є сервер. Чи хтось може запропонувати кращий код

Ось для вас:

sed '/\[remi\]/,/enabled=0/ { s/enabled=0/enabled=1/ }' remi.repo

Інший матеріал, в якому я не впевнений: PI хочу редагувати файл, у якому це тест як Text Testing = "0" (Так, у нього є лапки, і мені потрібно зберегти його) Це повинно бути змінено з Testing = "0" на Testing = " 1 "(з цитатами)

sed 's/Testing = "0"/Testing = "1"/g'

Також мені потрібно додати трохи тексту з цитатами в кінці файлу з sed На кшталт "Дякую Quanta" (з цитатою) Для php ви ставите \ з лунаючими цитатами, не знаю, як це робиться для bash

sed '$a"Werulz, you are welcome"\'

Інша річ, що мені потрібно змінити рядок у конф., Але я не пам'ятаю, який текст замінюється

Як його слухати = щось; , я хочу змінити його для прослуховування = /tmp/php5-fpm.sock;

sed 's/listen = .*/listen = \/tmp\/php5-fpm.sock;/'

'sed' / увімкнено = 1 / a \ пріоритет = 10 '/etc/yum.repos.d/epel.repo' відредагує файл та збереже зміни.
Затягніть

@Werulz: Просто перевірте файл, який не має значення, або скопіюйте вміст epel.repo у файл у домашній каталог та спробуйте запустити його без привілеїв root / superuser.
Ерік I

-iне є стандартним варіантом для sed. edпроте пропонує стандартний спосіб редагування файлів із синтаксисом, дуже схожим на sed.
kojiro

Я оновив своє перше повідомлення, щоб попросити ще одну пропозицію. Дякую за підтримку до цих пір.
Werulz

Я знову оновив пост ...... вибачте, що задаєте стільки питань.
Поділимося

12

Як ptman сказав, Авгіі можуть врятувати вас від використання sed/ awk:

$ augtool -s set /files/etc/yum.repos.d/epel.repo/epel/priority 10

встановить пріоритет epelсховища на 10. Якщо priorityключ вже існує, він встановить його значення, інакше він додасть priorityзапис після останнього запису в розділі.

Те саме стосується інших значень, які ви можете змінити.

Якщо ви хочете змінити кілька значень, ви навіть можете використовувати augtoolяк інтерпретатор:

$ cat epel.augtool
#!/usr/bin/augtool -sf

# Make a variable
defvar epel /files/etc/yum.repos.d/epel.repo/epel

# Set values
set $epel/enable 1
set $epel/priority 10
set $epel/Testing 0
$ chmod +x epel.augtool
$ ./epel.augtool
Saved 1 file(s)

Якщо ви хочете зберегти його у вашому скрипті bash, ви можете передавати команди в augtool:

cat <<EOF | augtool
# Make a variable
defvar epel /files/etc/yum.repos.d/epel.repo/epel

# Set values
set $epel/enable 1
set $epel/priority 10
set $epel/Testing 0
save
EOF

Див. man augtoolДодаткові варіанти.

Існує кілька переваг використання Augeas vs sed/ awk:

  • У Augeas є парсери, які знають про синтаксис файлу (у даному випадку - yum.repoсинтаксис). Ви не ризикуєте порушити синтаксис файлу, якщо ваш регулярний вираз помиляється;
  • аналізатор Augeas yum.repo знає про yum.repoрозділи, тож ви знаєте, що ви редагуєте правильний розділ;
  • Аугеас безсильний. Він внесе зміни у файл, лише якщо будуть внесені зміни. Якщо всі значення вже встановлені, файл не змінить;
  • У Augeas є постачальник ляльок, тому ви можете легко автоматизувати це в ляльковій інфраструктурі;
  • якщо параметри ще не існують, Augeas створить їх для вас. Якщо розділ ще не існує, Аугеас також створить його з відповідним синтаксисом.

Дякую за відповідь ...... буде вважати це точно .... Чи можете ви навести приклад того, як це використовувати з моїм скриптом bash
Werulz

Добре, дивіться мою редакцію.
phaphink

2

Ви також можете перевірити Augeas , інструмент для програмної модифікації конфігураційних файлів. Він дуже потужний у поєднанні з Puppet (система управління конфігурацією), але також може бути використаний сам.


Що це за lol
Werulz

2
Ви можете покращити якість цієї відповіді, надавши короткий опис того, що таке / робить Аггея, а також додавши приклад або два.
ThatGraemeGuy

Я додав нове запитання хлопців
Werulz
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.