Edite um arquivo via script bash


12

Eu sou um iniciante em scripts bash.Eu quero criar um script bash para instalar, instalar e configurar itens 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. Abrir 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 ativada = 1 na seção epel

Para a primeira parte eu adicionei

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

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

Também em alguns momentos terei que modificar variáveis ​​nos 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 pouco de texto a um arquivo e salve-o (com nano)

Eu sei que é exigente, mas eu preciso criar isso para um amigo que é novato em gerenciamento de servidores. Infelizmente, não tenho tempo para estudar scripts bash desde o início, pois meus exames estão próximos. Usarei seus exemplos para escrever o script.


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

No entanto, tenho outro problema. Suponha que eu queira modificar o nginx.conf usando o sed. Vamos lidar com o worker_processes.
Agora eu quero usar o sed para fazer o seguinte: 1. Encontre a PRIMEIRA ocorrência de worker_processes em que conf e substituir texto comworker_processes 4;

Nota especial aqui: Este é apenas um exemplo. Pode acontecer que o conf contenha worker_processes 1; . Esta é uma parte difícil. Eu quero um comando sed que encontre a caixa de correspondência PRIMEIRO wHOLE da palavra worker_processes , exclua a linha de texto onde a palavra foi encontrada e cole worker_processes 4;-a e salve o arquivo. Este é o método mais confiável para a edição de arquivos (sem risco de quebrar qualquer conf

Uma última sugestão: usei sed -i 's / enabled = 0 / enabled = 1 / g' /etc/yum.repos.d/remi.repo para alterar enabled = 0 to enabled = 1 na seção [remi] em remi .repo .No entanto, tenho a sensação de que ele pode modificar todos os habilitados = 0 nesse arquivo, o que provocará o servidor. Alguém pode sugerir um código melhor.


Outra coisa de que não tenho certeza: o PI deseja editar um arquivo com este como Text Testing = "0" (Sim, possui aspas e preciso mantê-lo). Ele deve ser modificado de Testing = "0" para Testing = " 1 "(entre aspas)

Também preciso adicionar algum texto com aspas no final de um arquivo com sed Como "Thanks Quanta" (com aspas) Para php você coloca um \ com aspas que ecoam, não sei como é feito para o bash

Outra coisa
eu preciso modificar uma linha em um conf, mas não me lembro qual é o texto inteiro a ser substituído

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

Grandes polegares para cima para cima quanta

Obrigado pela incrível equipe de suporte

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 desejar (faça o backup com a .bakextensão primeiro):

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

Agora eu quero usar sed para fazer o seguinte 1. Encontre a PRIMEIRA ocorrência de worker_processes nessa conf e substitua o texto por worker_processes 4;

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

Uma última sugestão que eu utilizado sed -i 's/enabled=0/enabled=1/g' /etc/yum.repos.d/remi.repopara mudar enabled=0para enabled=1debaixo da [remi]seção remi.repo. No entanto, tenho a sensação de que ele pode modificar tudo enabled=0nesse arquivo, o que provocará o servidor. Alguém pode sugerir um código melhor

Aqui para você:

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

Outra coisa de que não tenho certeza: o PI deseja editar um arquivo com este como Text Testing = "0" (Sim, possui aspas e preciso mantê-lo). Ele deve ser modificado de Testing = "0" para Testing = " 1 "(entre aspas)

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

Também preciso adicionar algum texto com aspas no final de um arquivo com sed Como "Thanks Quanta" (com aspas) Para php você coloca um \ com aspas que ecoam, não sei como é feito para o bash

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

Outra coisa que eu preciso modificar uma linha em um conf, mas não me lembro qual é o texto inteiro a ser substituído

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

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

'sed' / enabled = 1 / a \ priority = 10 '/etc/yum.repos.d/epel.repo' editará o arquivo e salvará as alterações.Por
favor

@Werulz: verifique com um arquivo que não importa ou copie o conteúdo do epel.repo para um arquivo no diretório inicial e tente executá-lo lá sem privilégios de root / superusuário.
Erik I

-inão é uma opção padrão para sed. ed, no entanto, oferece uma maneira compatível com os padrões de editar arquivos com sintaxe muito semelhante à do sed.
Kojiro

Eu atualizei meu primeiro post para fazer outra sugestão. Muito obrigado pelo suporte até agora quanta.
Werulz 22/08/2012

Atualizei o post novamente ... desculpe por fazer tantas perguntas. Compartilhará script com você no caso de precisar de u
Werulz

12

Como o ptman disse, o 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 epelrepositório como 10. Se a prioritychave já existir, ela definirá seu valor, caso contrário, adicionará umpriority entrada após a última entrada na seção.

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

Se você deseja modificar vários valores, pode até usar augtoolcomo intérprete:

$ 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ê deseja mantê-lo em seu script bash, pode 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

Vejo man augtool para mais opções.

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

  • O Augeas possui analisadores que sabem sobre a sintaxe do arquivo (neste caso, yum.reposintaxe). Você não correrá o risco de quebrar a sintaxe do arquivo se seu regex estiver errado;
  • o analisador Augeas yum.repo conhece as yum.reposeções; portanto, você sabe que está editando a seção correta;
  • Augeas é idempotente. Ele 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;
  • O Augeas possui um provedor Puppet, para que você possa automatizar isso facilmente em uma infraestrutura Puppet;
  • se os parâmetros ainda não existirem, o Augeas os criará para você. Se a seção ainda não existir, o Augeas também a criará, com a sintaxe apropriada.

Obrigado pela resposta ...... considerá-lo com certeza .... u pode dar um exemplo de como usá-lo com o meu script bash
Werulz

Ok, veja minha edição.
precisa saber é o seguinte

2

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


O que é que lol
Werulz

2
Você pode melhorar a qualidade desta resposta fornecendo uma breve descrição do que o Augeas é / faz e também adicionando um exemplo ou dois.
precisa saber é o seguinte

Eu adicionei uma nova pergunta pessoal
Werulz
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.