Назад | Перейти на главную страницу

Отредактируйте файл через скрипт bash

Я новичок в написании сценариев на bash. Я хочу создать сценарий bash для автоматической установки и настройки компонентов в моем Linux.

Предположим, я хочу отредактировать

/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. Testing = "1" на Testing = "0"
  3. Добавьте текст в строку. functions = to function = "text1", "text2"
  4. Добавьте текст в файл и сохраните его (с помощью nano)

Я знаю, что это требовательно, но мне нужно создать это для друга, который является новичком в управлении сервером. К сожалению, у меня нет времени изучать скрипты bash с самого начала, так как мои экзамены так близки. Я буду использовать ваши примеры для написания скрипта.


Ребята, спасибо за все ответы. Я успешно выполнил большую часть сценария bash.

Однако у меня есть другая проблема. Предположим, я хочу изменить nginx.conf с помощью sed. Мы будем иметь дело с worker_processes.
Теперь я хочу использовать sed, чтобы сделать следующее: 1. Найдите ПЕРВОЕ появление из worker_processes в этой конфигурации и замените текст на worker_processes 4;

Специальное примечание: это всего лишь пример. Может случиться так, что conf содержит worker_processes 1; . Это сложная часть. Мне нужна команда sed, которая находит Случай матча ПЕРВЫЙ КОТ слова worker_processes , удалите строку текста, в которой найдено слово, и вставьте worker_processes 4; тут же сохраняем файл. Это самый надежный метод редактирования файлов (без риска нарушения каких-либо настроек).

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


Еще кое-что, в чем я не уверен: PI хочу отредактировать файл, который имеет это как Text Testing = "0" (да, в нем есть кавычки, и мне нужно их сохранить). Его следует изменить с Testing = "0" на Testing = " 1 "(в кавычках)

Также мне нужно добавить текст с кавычками в конец файла с помощью sed. Например, «Спасибо, Quanta» (с цитатой). Для php вы помещаете \ с повторяющимися кавычками, не знаю, как это делается для bash

Еще одна вещь
Мне нужно изменить строку в конфиге, но я не помню, какой текст нужно заменить

Как и его listen = something; , я хочу изменить его на listen = /tmp/php5-fpm.sock;

Большие пальцы вверх для квантов

Спасибо за отличную поддержку, ребята

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. Найти ПЕРВОЕ появление worker_processes в этом conf и заменить текст на worker_processes 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"\'

Еще мне нужно изменить строку в конфиге, но я не помню, какой текст нужно заменить

Как и его listen = something; , я хочу изменить его на listen = /tmp/php5-fpm.sock;

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

Как сказал птман, Авгий может спасти вас от использования 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 есть поставщик Puppet, так что вы можете легко автоматизировать это в инфраструктуре Puppet;
  • если параметры еще не существуют, Augeas создаст их за вас. Если раздел еще не существует, Augeas также создаст его с правильным синтаксисом.

Вы также можете проверить Авгий, инструмент для программного изменения файлов конфигурации. Очень мощный в сочетании с Кукольный (система управления конфигурацией), но также может использоваться отдельно.