Редактировать файл с помощью скрипта bash

12

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

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


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

Однако у меня есть другая проблема Давайте предположим , что я хочу изменить nginx.conf с использованием СЭД Мы будем иметь дело с worker_processes
Теперь я хочу использовать СЭД сделать следующее 1.Find на первое вхождение в worker_processes в этой конф и замена текстаworker_processes 4;

Специальное примечание здесь: это всего лишь пример. Может случиться так, что conf содержит worker_processes 1; , Это сложная часть. Мне нужна команда sed, которая находит ПЕРВЫЙ случай совпадения WHOLE слова 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.

Еще одна вещь,
мне нужно изменить строку в Conf, но я не помню, что весь текст заменить

Как его слушать = что-то; Я хочу изменить его, чтобы слушать = /tmp/php5-fpm.sock;

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

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

Werulz
источник

Ответы:

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. Найдите ПЕРВОЕ вхождение 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"\'

Еще одна вещь, мне нужно изменить строку в Conf, но я не помню, что весь текст заменить

Как его слушать = что-то; Я хочу изменить его, чтобы слушать = /tmp/php5-fpm.sock;

sed 's/listen = .*/listen = \/tmp\/php5-fpm.sock;/'
кванты
источник
'sed' / enabled = 1 / a \ priority = 10 '/etc/yum.repos.d/epel.repo' отредактирует файл и сохранит изменения.
Пожалуйста,
@Werulz: просто проверьте файл, который не имеет значения, или скопируйте содержимое файла epel.repo в файл в домашнем каталоге и попробуйте запустить его там без прав root / superuser.
Эрик, я
-iне является стандартным вариантом для sed. edоднако предлагает совместимый со стандартами способ редактирования файлов с синтаксисом, очень похожим на синтаксис sed.
Кодзиро
Я обновил свой первый пост, чтобы попросить вас еще одно предложение. Большое спасибо за поддержку до сих пор квантов.
Верулц
Я снова обновил пост ...... извините за то, что задал так много вопросов.
Поделюсь
12

Как сказал ptman, Augeas может спасти вас от использования 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 есть поставщик Puppet, так что вы можете легко автоматизировать это в инфраструктуре Puppet;
  • если параметры еще не существуют, Augeas создаст их для вас. Если раздел еще не существует, Augeas также создаст его с правильным синтаксисом.
ℝaphink
источник
Спасибо за ответ ...... рассмотрим его наверняка .... Можете ли вы привести пример того, как использовать его с моим сценарием bash
Werulz
Хорошо, см. Мое редактирование.
ℝaphink
2

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

ptman
источник
Что это за лол
Верулц
2
Вы можете улучшить качество этого ответа, предоставив краткое описание того, что Augeas / делает, а также добавив один или два примера.
ThatGraemeGuy
Я добавил новый вопрос, ребята
Werulz