Editar un archivo a través de script bash

12

Soy un principiante en bash scripting. Quiero crear un script bash para instalar, instalar y configurar cosas en mi caja de Linux de forma automatizada.

Supongamos que quiero editar

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

por el script bash

Lo que quiero hacer es lo siguiente

  1. Abra el archivo /etc/yum.repos.d/epel.repo
  2. Buscar la sección [epel]
  3. Agregue una prioridad de línea = 10 justo después de la línea habilitada = 1 en la sección de epel

Para la primera parte agregué

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

Mi pregunta es cómo hacer la segunda y tercera parte con el script bash usando nano (si es posible, en caso de que no sea posible, muéstrame con sed)

También en algunos puntos tendré que modificar variables en archivos. Por ejemplo

  1. habilitar = 0 para habilitar = 1
  2. Prueba = "1" a Prueba = "0"
  3. Añadir texto en una línea. funciones = a función = "texto1", "texto2"
  4. Agregue texto a un archivo y guárdelo (con nano)

Sé que es exigente, pero necesito crear esto para un amigo que es novato en la administración de servidores. Desafortunadamente, no tengo tiempo para estudiar scripts de bash desde el principio, ya que mis exámenes están cerca. Usaré sus ejemplos para escribir el script.


Chicos, gracias por todas las respuestas que he hecho con éxito la mayor parte del script bash

Sin embargo, tengo otro problema. Supongamos que quiero modificar nginx.conf usando sed. Trataremos con obrero_procesos.
Ahora quiero usar sed para hacer lo siguiente. 1.Encontrar la PRIMERA aparición de worker_processes esa configuración y reemplazar el texto conworker_processes 4;

Nota especial aquí: este es solo un ejemplo. Puede suceder que la conf contenga trabajador_procesos 1; . Esta es una parte difícil. Quiero un comando sed que encuentre el primer caso de coincidencia de la palabra trabajador_procesos , elimine la línea de texto donde se encuentra la palabra y pegue worker_processes 4;allí y luego guarde el archivo. Este es el método más confiable que pensé al editar archivos (sin ningún riesgo de romper cualquier conf

Una última sugerencia que utilicé sed -i 's / enabled = 0 / enabled = 1 / g' /etc/yum.repos.d/remi.repo para cambiar enabled = 0 a enabled = 1 en la sección [remi] en remi .repo. Sin embargo, tengo la sensación de que puede modificar todo habilitado = 0 en ese archivo, lo que dañará el servidor. ¿Alguien puede sugerir un código mejor?


Otra cosa de la que no estoy seguro: PI quiere editar un archivo que tiene esto como Prueba de texto = "0" (Sí, tiene comillas y necesito mantenerlo) Debe modificarse de Prueba = "0" a Prueba = " 1 "(con comillas)

También necesito agregar algo de texto con comillas al final de un archivo con sed Como "Gracias Quanta" (con comillas) Para php pones un \ con comillas de eco, no sé cómo se hace para bash

Otra cosa
que necesito para modificar una línea en una conf pero no recuerdo cuál es el texto completo para reemplazar

Al igual que su escuchar = algo; , quiero modificarlo para escuchar = /tmp/php5-fpm.sock;

Un gran aprobado para quanta

Gracias por el increíble apoyo chicos

Werulz
fuente

Respuestas:

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

Especifique una opción de edición in situ ( -i) si lo desea ( .bakprimero realiza la copia de seguridad con la extensión):

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

Ahora quiero usar sed para hacer lo siguiente 1.Encontrar la PRIMERA aparición de worker_processes en esa conf y reemplazar el texto con worker_processes 4;

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

Una última sugerencia que utiliza sed -i 's/enabled=0/enabled=1/g' /etc/yum.repos.d/remi.repopara cambiar enabled=0a enabled=1bajo la [remi]sección de remi.repo. Sin embargo, tengo la sensación de que puede modificar todo enabled=0en ese archivo, lo que dañará el servidor. ¿Alguien puede sugerir un código mejor?

Aquí para ti:

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

Otra cosa de la que no estoy seguro: PI quiere editar un archivo que tiene esto como Prueba de texto = "0" (Sí, tiene comillas y necesito mantenerlo) Debe modificarse de Prueba = "0" a Prueba = " 1 "(con comillas)

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

También necesito agregar algo de texto con comillas al final de un archivo con sed Como "Gracias Quanta" (con comillas) Para php pones un \ con comillas de eco, no sé cómo se hace para bash

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

Otra cosa que necesito para modificar una línea en una conf pero no recuerdo cuál es el texto completo para reemplazar

Al igual que su escuchar = algo; , quiero modificarlo para escuchar = /tmp/php5-fpm.sock;

sed 's/listen = .*/listen = \/tmp\/php5-fpm.sock;/'
quanta
fuente
'sed' / enabled = 1 / a \ priority = 10 '/etc/yum.repos.d/epel.repo' editará el archivo y guardará los cambios. Confirme por
favor
@Werulz: solo verifique con un archivo que no importa o copie el contenido de epel.repo a un archivo en el directorio de inicio e intente ejecutarlo allí sin privilegios de root / superusuario.
Erik I
-iNo es una opción estándar para sed. ed, sin embargo, ofrece una forma compatible con los estándares para editar archivos con una sintaxis muy similar a la de sed.
kojiro
Actualicé mi primera publicación para pedirte otra sugerencia. Muchas gracias por el apoyo hasta ahora quanta.
Werulz
Actualicé la publicación nuevamente ... perdón por hacer tantas preguntas. Compartirá script con usted en caso de que lo necesite
Werulz
12

Como dijo ptman, Augeas puede salvarte del uso de sed/ awk:

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

establecerá la prioridad del epelrepositorio en 10. Si la priorityclave ya existe, establecerá su valor; de lo contrario, agregará una priorityentrada después de la última entrada en la sección.

Lo mismo ocurre con otros valores que tal vez desee modificar.

Si desea modificar varios valores, incluso puede usarlo 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)

Si desea mantenerlo en su script bash, puede canalizar los comandos en 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

Ver man augtoolpara más opciones.

Hay varias ventajas para usar Augeas vs sed/ awk:

  • Augeas tiene analizadores que conocen la sintaxis del archivo (en este caso, la yum.reposintaxis). No correrá el riesgo de romper la sintaxis del archivo si su expresión regular es incorrecta;
  • el analizador Augeas yum.repo conoce las yum.reposecciones, por lo que sabe que está editando la sección correcta;
  • Augeas es idempotente. Solo realizará cambios en el archivo si hay cambios que realizar. Si todos los valores ya están establecidos, no modificará el archivo;
  • Augeas tiene un proveedor de Puppet, por lo que puede automatizarlo fácilmente en una infraestructura de Puppet;
  • Si los parámetros aún no existen, Augeas los creará por usted. Si la sección aún no existe, Augeas también la creará, con la sintaxis adecuada.
Phaphink
fuente
Gracias por la respuesta ... lo consideraré seguro ... ¿Puede dar un ejemplo de cómo usarlo con mi script de bash
Werulz
Ok, mira mi edición.
phaphink
2

También es posible que desee consultar Augeas , herramienta para modificar mediante programación los archivos de configuración. Es muy potente en combinación con Puppet (un sistema de gestión de configuración), pero también se puede usar solo.

ptman
fuente
¿Qué es eso jaja?
Werulz
2
Puede mejorar la calidad de esta respuesta proporcionando una breve descripción de lo que es / hace Augeas, y también agregando un ejemplo o dos.
ThatGraemeGuy
Agregué