Modifica un file tramite lo script bash


12

Sono un principiante nello scripting bash. Voglio creare uno script bash per installare l'installazione e configurare i contenuti sul mio box di Linux in modo automatizzato.

Supponiamo che io voglia modificare

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

dallo script bash

Quello che voglio fare è il seguente

  1. Apri il file /etc/yum.repos.d/epel.repo
  2. Trova la sezione [epel]
  3. Aggiungi una priorità di linea = 10 subito dopo la linea abilitata = 1 nella sezione epel

Per la prima parte ho aggiunto

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

La mia domanda è come fare la 2a e 3a parte con bash script usando nano (se possibile, nel caso non fosse possibile, allora mostrami con sed)

Anche in alcuni punti dovrò modificare le variabili nei file per es

  1. abilita = 0 per abilitare = 1
  2. Testing = "1" a Testing = "0"
  3. Aggiungi testo in una riga. funzioni = per funzione = "testo1", "testo2"
  4. Aggiungi del testo a un file e salvalo (con nano)

So che è impegnativo, ma devo crearlo per un amico che non è esperto nella gestione dei server. Sfortunatamente non ho tempo di studiare lo script bash fin dall'inizio dei miei esami. Userò i tuoi esempi per scrivere lo script.


Ragazzi, grazie per tutte le risposte che ho fatto con successo la maggior parte della sceneggiatura di Bash

Comunque ho un altro problema Supponiamo che io voglia modificare nginx.conf usando sed Ci occuperemo di worker_processes
Ora voglio usare sed per fare quanto segue 1. Trovare la PRIMA occorrenza di worker_processes in quella conf e sostituire il testo conworker_processes 4;

Nota speciale qui: questo è solo un esempio. Può succedere che il conf contenga worker_processes 1; . Questa è una parte difficile. Voglio un comando sed che trovi il PRIMO caso di corrispondenza di WHOLE della parola worker_processes , elimini la riga di testo in cui si trova la parola e li incolli worker_processes 4;e quindi salvi il file. Questo è il metodo più affidabile che ho pensato durante la modifica dei file (senza alcun rischio di interrompere qualsiasi conf

Un ultimo suggerimento ho usato sed -i 's / enabled = 0 / enabled = 1 / g' /etc/yum.repos.d/remi.repo per cambiare enabled = 0 in enabled = 1 nella sezione [remi] in remi .repo. Tuttavia ho la sensazione che possa modificare tutti abilitati = 0 in quel file, il che rovinerà il server. Qualcuno può suggerire un codice migliore.


Un'altra cosa di cui non sono sicuro: PI vuole modificare un file che ha questo come Test del testo = "0" (Sì, ha virgolette e devo tenerlo) Dovrebbe essere modificato da Test = "0" a Test = = 1 "(con virgolette)

Inoltre ho bisogno di aggiungere un po 'di testo con le virgolette alla fine di un file con sed. Come "Grazie Quanta" (con virgolette) Per php hai messo un \ con eco tra virgolette, non so come è fatto per bash

Un'altra cosa che
devo modificare una riga in un conf, ma non ricordo quale sia l'intero testo da sostituire

Mi piace ascolta = qualcosa; , voglio modificarlo per ascoltare = /tmp/php5-fpm.sock;

Grandi pollici in su per quanti

Grazie per il fantastico supporto ragazzi

Risposte:


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

-iSe lo desideri, specifica un'opzione di modifica sul posto ( ) (effettua prima il backup con .bakestensione):

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

Ora voglio usare sed per fare quanto segue 1.Trova la PRIMA occorrenza di worker_processes in quella conf e sostituisci il testo con worker_processes 4;

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

Un ultimo suggerimento che ho usato sed -i 's/enabled=0/enabled=1/g' /etc/yum.repos.d/remi.repoper cambiare enabled=0per enabled=1sotto la [remi]sezione remi.repo. Tuttavia ho la sensazione che possa modificare tutto enabled=0in quel file, il che rovinerà il server. Qualcuno può suggerire un codice migliore

Qui per te:

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

Un'altra cosa di cui non sono sicuro: PI vuole modificare un file che ha questo come Test del testo = "0" (Sì, ha virgolette e devo tenerlo) Dovrebbe essere modificato da Test = "0" a Test = = " 1 "(tra virgolette)

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

Inoltre ho bisogno di aggiungere un po 'di testo con le virgolette alla fine di un file con sed. Come "Grazie Quanta" (con virgolette) Per php hai messo un \ con eco tra virgolette, non so come è fatto per bash

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

Un'altra cosa che devo modificare una riga in un conf, ma non ricordo quale sia l'intero testo da sostituire

Mi piace ascolta = qualcosa; , voglio modificarlo per ascoltare = /tmp/php5-fpm.sock;

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

'sed' / enabled = 1 / a \ priority = 10 '/etc/yum.repos.d/epel.repo' modificherà il file e salverà le
modifiche

@Werulz: basta controllare con un file che non ha importanza o copiare il contenuto di epel.repo in un file nella directory home e provare a eseguirlo lì senza i privilegi di root / superutente.
Erik I,

-inon è un'opzione standard per sed. edtuttavia offre un modo conforme agli standard per modificare i file con sintassi molto simili a quelli di sed.
Kojiro,

Ho aggiornato il mio primo post per chiederti un altro suggerimento. Grazie mille per il supporto finora.
Werulz,

Ho aggiornato di nuovo post ...... scusate per aver fatto così tante domande. Condividerò lo script con te in caso di necessità
Werulz,

12

Come ptman detto, Augia si può salvare da utilizzando sed/ awk:

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

imposterà la priorità del epelrepository su 10. Se la prioritychiave esiste già, imposterà il suo valore, altrimenti aggiungerà una priorityvoce dopo l'ultima voce nella sezione.

Lo stesso vale per altri valori che potresti voler modificare.

Se vuoi modificare diversi valori, puoi persino usare augtoolcome interprete:

$ 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 vuoi tenerlo nel tuo script bash, puoi inserire i comandi in 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

Vedi man augtoolper più opzioni.

Esistono diversi vantaggi nell'utilizzo di Augeas vs sed/ awk:

  • Augeas ha parser che conoscono la sintassi del file (in questo caso, yum.reposintassi). Non correrai il rischio di interrompere la sintassi del file se la tua regex è sbagliata;
  • il parser Augeas yum.repo conosce le yum.reposezioni, quindi sai che stai modificando la sezione giusta;
  • Augeas è idempotente. Apporterà modifiche al file solo se ci sono modifiche da apportare. Se tutti i valori sono già impostati, non modificherà il file;
  • Augeas ha un fornitore di marionette, quindi puoi facilmente automatizzarlo in un'infrastruttura di marionette;
  • se i parametri non esistono ancora, Augeas li creerà per te. Se la sezione non esiste ancora, anche Augeas la creerà, con la sintassi corretta.

Grazie per la risposta ...... lo prenderò sicuramente in considerazione .... Puoi fare un esempio di come usarlo con il mio script bash
Werulz,

Ok, guarda la mia modifica.
inkaphink,

2

Potresti anche voler dare un'occhiata a Augeas , strumento per modificare a livello di programmazione i file di configurazione. È molto potente in combinazione con Puppet (un sistema di gestione della configurazione), ma può anche essere usato da solo.


Cos'è quel lol
Werulz il

2
Puoi migliorare la qualità di questa risposta fornendo una breve descrizione di ciò che Augeas è / fa, e anche aggiungendo un esempio o due.
ThatGraemeGuy

Ho aggiunto una nuova domanda, ragazzi
Werulz,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.