Editar um arquivo via script bash

12

Eu sou um iniciante no bash scripting.Eu quero criar um script bash para instalar instalar e configurar coisas na minha caixa Linux de forma automatizada.

Suponha que eu queira editar

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

pelo script bash

O que eu quero fazer é o seguinte

  1. Abra o arquivo /etc/yum.repos.d/epel.repo
  2. Encontre a seção [epel]
  3. Adicione uma prioridade de linha = 10 logo após a linha ser ativada = 1 na seção epel

Para a primeira parte, adicionei

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

Minha pergunta é como fazer a 2ª e a 3ª parte com o script bash usando nano (se possível, caso não seja possível, então mostre-me com sed)

Também em alguns pontos eu terei que modificar variáveis em arquivos Por exemplo,

  1. enable = 0 para ativar = 1
  2. Teste="1" para teste="0"
  3. Adicione texto em uma linha. funções = para funcionar="texto1", "texto2"
  4. Adicione um texto a um arquivo e salve-o (com nano)

Eu sei que é exigente, mas eu preciso criar isso para um amigo que é noob no gerenciamento de servidor.Infelizmente eu não tenho tempo para estudar bash scripting do início como meus exames tão perto.Eu vou usar seus exemplos para escrever o roteiro.

Pessoal obrigado por todas as respostas Eu fiz com sucesso a maior parte do script bash

No entanto, tenho outro problema Vamos supor que eu queira modificar o nginx.conf usando sed Nós vamos lidar com o worker_processes
Agora eu quero usar sed para fazer o seguinte 1. Encontre a PRIMEIRA ocorrência de worker_processes nesse conf e substitua o texto por worker_processes 4;

Nota especial aqui: Este é apenas um exemplo. Pode acontecer que o conf contenha worker_processes 1; . Isso é parte difícil. Eu quero um comando sed que encontre o PRIMEIRO caso de correspondência wHOLE da palavra worker_processes , exclua a linha de texto em que a palavra é encontrada e cole worker_processes 4; lá e salve Arquivo. Este é o método mais confiável de quando eu edito arquivos (sem nenhum risco de quebrar qualquer conf

Uma última sugestão eu usei sed -i 's / enabled = 0 / enabled = 1 / g' /etc/yum.repos.d/remi.repo para ativar ativado = 0 para habilitado = 1 sob a seção [remi] em remi.repo. No entanto, tenho a sensação de que ele pode modificar todos habilitado = 0 nesse arquivo, que irá causar o servidor.Qualquer um sugerir um código melhor.

Outra coisa que eu não tenho certeza: P Eu quero editar um arquivo que tenha isso como texto Testando="0" (Sim, tem aspas e eu preciso manter) Deve ser modificado de Teste="0" para teste="1" (com aspas)

Também preciso adicionar algum texto com aspas no final de um arquivo com sed Como "Obrigado Quanta" (com aspas) Para php você coloca um \ com eco citações, não sei como é feito por bash

Outra coisa | Eu preciso modificar uma linha em um conf, mas não me lembro o que é todo o texto para substituir

Como sua escuta = alguma coisa; , eu quero modificá-lo para ouvir = /tmp/php5-fpm.sock;

Grande aprovação para os quanta

Obrigado pelo apoio incrível pessoal

    
por Werulz 21.08.2012 / 10:02

3 respostas

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

Especifique uma opção de edição no local ( -i ) se você quiser (faz o backup com a extensão .bak primeiro):

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

Now i want use sed to do the following 1.Find the FIRST occurrence of worker_processes in that conf and replace text with worker_processes 4;

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

One last suggestion I used sed -i 's/enabled=0/enabled=1/g' /etc/yum.repos.d/remi.repo to change enabled=0 to enabled=1 under the [remi] section in remi.repo. However i have a feeling that it may modify all enabled=0 in that file , which will wreak the server.Can anyone suggest a better code

Aqui para você:

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

Another stuff i am not sure of:P I want to edit a file that has this as Text Testing = "0"(Yes it has quotes and i need to keep it) It should be modified from Testing = "0" to Testing = "1"(with quotes)

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

Also i need to add some text with quotes at the end of a file with sed Like "Thanks Quanta"(with quote) For php you put a \ with echoing quotes , don't know how it is done for bash

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

Another thing I need to modify a line in a conf but i don't remember what is the whole of text to replaced

Like its listen = something; , i want to modify it to listen = /tmp/php5-fpm.sock;

sed 's/listen = .*/listen = \/tmp\/php5-fpm.sock;/'
    
por 21.08.2012 / 10:08
12

Como a ptman disse, Augeas pode evitar que você use sed / awk :

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

definirá a prioridade do repositório epel para 10. Se a chave priority já existir, ela definirá seu valor, caso contrário, ela adicionará uma entrada priority após a última entrada na seção.

O mesmo vale para outros valores que você pode querer modificar.

Se você quiser modificar vários valores, você pode até usar augtool como um interpretador:

$ 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)

Se você quiser mantê-lo em seu script bash, poderá canalizar os comandos para 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

Veja man augtool para mais opções.

Existem várias formas de usar o Augeas vs sed / awk :

  • O Augeas tem analisadores que conhecem a sintaxe do arquivo (neste caso, yum.repo syntax). Você não correrá o risco de quebrar a sintaxe do arquivo se o seu regex estiver errado;
  • o analisador Augeas yum.repo sabe sobre yum.repo seções, então você sabe que está editando a seção correta;
  • Augeas é idempotente. Só fará alterações no arquivo se houver alterações a serem feitas. Se todos os valores já estiverem definidos, ele não modificará o arquivo;
  • Augeas tem um provedor de marionetes, para que você possa automatizar isso facilmente em uma infraestrutura de marionetes;
  • se os parâmetros ainda não existem, Augeas irá criá-los para você. Se a seção ainda não existir, o Augeas também a criará, com a sintaxe adequada.
por 21.08.2012 / 11:34
2

Você também pode querer verificar Augeas , ferramenta para modificar programaticamente os arquivos de configuração. É muito poderoso em combinação com Puppet (um sistema de gerenciamento de configuração), mas também pode ser usado sozinho.

    
por 21.08.2012 / 10:26