Modifier un fichier via le script bash


12

Je suis un débutant en script bash, je veux créer un script bash pour installer, installer et configurer des trucs sur ma boîte Linux de manière automatisée.

Supposons que je veuille éditer

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

par le script bash

Ce que je veux faire, c'est comme suit

  1. Ouvrir le fichier /etc/yum.repos.d/epel.repo
  2. Rechercher la section [epel]
  3. Ajouter une priorité de ligne = 10 juste après la ligne activée = 1 dans la section epel

Pour la première partie, j'ai ajouté

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

Ma question est de savoir comment faire les 2 et 3ème parties avec le script bash en utilisant nano (si possible, dans le cas où ce n'est pas possible, montrez-moi avec sed)

À certains moments, je devrai également modifier des variables dans des fichiers, par exemple

  1. activer = 0 pour activer = 1
  2. Testing = "1" to Testing = "0"
  3. Ajoutez du texte sur une ligne. fonctions = à fonction = "texte1", "texte2"
  4. Ajoutez du texte à un fichier et enregistrez-le (avec nano)

Je sais que c'est exigeant mais j'ai besoin de créer cela pour un ami qui est un noob à la gestion de serveurs.Malheureusement, je n'ai pas le temps d'étudier le script bash dès le début de mes examens, j'utiliserai vos exemples pour écrire le script.


Merci les gars pour toutes les réponses que j'ai faites avec succès la plupart du script bash

Cependant, j'ai un autre problème Supposons que je souhaite modifier nginx.conf à l'aide de sed Nous traiterons avec worker_processes
Maintenant, je veux utiliser sed pour faire ce qui suit 1. Trouvez la PREMIÈRE occurrence de worker_processes dans cette conf et remplacez le texte parworker_processes 4;

Note spéciale ici: Ceci est juste un exemple. Il peut arriver que la conf contienne les processus de travail 1; . C'est une partie difficile. Je veux une commande sed qui trouve la casse de correspondance FIRST wHOLE du mot worker_processes , supprime la ligne de texte où le mot est trouvé et et worker_processes 4;y colle puis enregistre le fichier. C'est la méthode la plus fiable que je connaisse lors de la modification de fichiers (sans risque de rompre toute conf

Une dernière suggestion, j'ai utilisé sed -i 's / enabled = 0 / enabled = 1 / g' /etc/yum.repos.d/remi.repo pour changer enabled = 0 à enabled = 1 dans la section [remi] dans remi .repo .Cependant, j'ai le sentiment qu'il peut modifier tous les activé = 0 dans ce fichier, ce qui va détruire le serveur. Quelqu'un peut-il suggérer un meilleur code.


Autre chose dont je ne suis pas sûr: PI veut éditer un fichier qui a ceci comme Text Testing = "0" (Oui, il a des guillemets et je dois le garder) Il devrait être modifié de Testing = "0" à Testing = " 1 "(avec guillemets)

J'ai aussi besoin d'ajouter du texte avec des guillemets à la fin d'un fichier avec sed Comme "Merci Quanta" (avec guillemet) Pour php vous mettez un \ avec des guillemets en écho, je ne sais pas comment c'est fait pour bash

Une autre chose dont
j'ai besoin pour modifier une ligne dans une conf mais je ne me souviens pas quel est l'ensemble du texte à remplacer

Comme son écoute = quelque chose; , je veux le modifier pour écouter = /tmp/php5-fpm.sock;

Bravo pour les quanta

Merci pour le soutien formidable

Réponses:


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

Spécifiez une option d'édition sur place ( -i) si vous le souhaitez (effectue d'abord la sauvegarde avec l' .bakextension):

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

Maintenant, je veux utiliser sed pour faire ce qui suit 1. Trouver la PREMIÈRE occurrence de worker_processes dans cette conf et remplacer le texte par worker_processes 4;

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

Une dernière suggestion que j'utilisé sed -i 's/enabled=0/enabled=1/g' /etc/yum.repos.d/remi.repopour changer enabled=0de enabled=1sous la [remi]section remi.repo. Cependant, j'ai le sentiment qu'il peut tout modifier enabled=0dans ce fichier, ce qui va faire mal au serveur. Quelqu'un peut-il suggérer un meilleur code

Ici pour vous:

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

Autre chose dont je ne suis pas sûr: PI veut éditer un fichier qui a ceci comme Text Testing = "0" (Oui, il a des guillemets et je dois le garder) Il devrait être modifié de Testing = "0" à Testing = " 1 "(avec guillemets)

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

J'ai aussi besoin d'ajouter du texte avec des guillemets à la fin d'un fichier avec sed Comme "Merci Quanta" (avec guillemet) Pour php vous mettez un \ avec des guillemets en écho, je ne sais pas comment c'est fait pour bash

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

Une autre chose dont j'ai besoin pour modifier une ligne dans une conf mais je ne me souviens pas quel est l'ensemble du texte à remplacer

Comme son écoute = quelque chose; , je veux le modifier pour écouter = /tmp/php5-fpm.sock;

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

'sed' / enabled = 1 / a \ priority = 10 '/etc/yum.repos.d/epel.repo' éditera le fichier et enregistrera les modifications.Veuillez confirmer
Werulz

@Werulz: Vérifiez simplement avec un fichier qui n'a pas d'importance ou copiez le contenu de epel.repo dans un fichier du répertoire personnel et essayez de l'exécuter sans les privilèges root / superutilisateur.
Erik I

-in'est pas une option standard pour sed. ed, cependant, offre un moyen conforme aux normes de modifier des fichiers avec une syntaxe très similaire à celle de sed.
kojiro

J'ai mis à jour mon premier post pour vous demander une autre suggestion. Merci beaucoup pour le soutien jusqu'ici quanta.
Werulz

J'ai mis à jour le message à nouveau ... désolé d'avoir posé autant de questions. Partage le script avec vous au cas où vous en auriez besoin
Werulz

12

Comme l'a dit ptman, Augeas peut vous éviter d'utiliser sed/ awk:

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

définira la priorité du epelréférentiel sur 10. Si la priorityclé existe déjà, elle définira sa valeur, sinon elle ajoutera une priorityentrée après la dernière entrée de la section.

Il en va de même pour les autres valeurs que vous souhaiterez peut-être modifier.

Si vous souhaitez modifier plusieurs valeurs, vous pouvez même utiliser augtoolcomme interprète:

$ 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 vous souhaitez le conserver dans votre script bash, vous pouvez diriger les commandes vers 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

Voir man augtoolpour plus d'options.

Il y a plusieurs avantages à utiliser Augeas vs sed/ awk:

  • Augeas possède des analyseurs qui connaissent la syntaxe des fichiers (dans ce cas, la yum.reposyntaxe). Vous ne prendrez pas le risque de casser la syntaxe du fichier si vos expressions rationnelles sont erronées;
  • l'analyseur Augeas yum.repo connaît les yum.reposections, vous savez donc que vous éditez la bonne section;
  • Augeas est idempotent. Il n'apportera des modifications au fichier que si des modifications doivent être apportées. Si toutes les valeurs sont déjà définies, cela ne modifiera pas le fichier;
  • Augeas dispose d'un fournisseur Puppet, vous pouvez donc facilement automatiser cela dans une infrastructure Puppet;
  • si les paramètres n'existent pas encore, Augeas les créera pour vous. Si la section n'existe pas encore, Augeas la créera également, avec la syntaxe appropriée.

Merci pour la réponse ...... le considérera à coup sûr .... Pouvez-vous donner un exemple de la façon de l'utiliser avec mon script bash
Werulz

Ok, voyez mon montage.
ℝaphink

2

Vous voudrez peut-être également consulter Augeas , un outil pour modifier par programme les fichiers de configuration. Il est très puissant en combinaison avec Puppet (un système de gestion de configuration), mais peut également être utilisé seul.


Quel est ce lol
Werulz

2
Vous pouvez améliorer la qualité de cette réponse en fournissant une brève description de ce qu'est / fait Augeas, et en ajoutant un ou deux exemples.
ThatGraemeGuy

J'ai ajouté une nouvelle question les gars
Werulz
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.