Bearbeiten Sie eine Datei über ein Bash-Skript

12

Ich bin ein Anfänger im Bash-Scripting. Ich möchte ein Bash-Script erstellen, um die Installation und Konfiguration von Inhalten auf meiner Linux-Box auf automatisierte Weise durchzuführen.

Angenommen, ich möchte bearbeiten

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

durch das Bash-Skript

Was ich tun möchte, ist wie folgt

  1. Öffnen Sie die Datei /etc/yum.repos.d/epel.repo
  2. Suchen Sie den Abschnitt [epel]
  3. Fügen Sie eine Zeilenpriorität = 10 direkt nach Zeile aktiviert = 1 im Epel-Abschnitt hinzu

Für den ersten Teil habe ich hinzugefügt

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

Meine Frage ist, wie man den 2. und 3. Teil mit bash script mit nano macht (wenn möglich, falls nicht möglich, zeig es mir mit sed)

An einigen Stellen muss ich auch Variablen in Dateien ändern

  1. enable = 0, um = 1 zu aktivieren
  2. Testen = "1" bis Testen = "0"
  3. Fügen Sie Text in eine Zeile ein. functions = to function = "text1", "text2"
  4. Füge Text zu einer Datei hinzu und speichere sie (mit Nano)

Ich weiß, dass es anstrengend ist, aber ich muss es für einen Freund erstellen, der sich nicht mit Servermanagement auskennt.


Jungs, danke für all die Antworten, die ich im Bash-Skript größtenteils erfolgreich gemacht habe

Allerdings habe ich ein anderes Problem Lets i sed ändern annehmen wollen nginx.conf nutzen wir mit worker_processes befassen wird
nun möchte ich den Einsatz sed folgendes 1.Suchen das zu tun , das erste Vorkommen von worker_processes in dieser conf und Ersetzen von Text mitworker_processes 4;

Besonderer Hinweis: Dies ist nur ein Beispiel. Es kann vorkommen, dass die conf worker_processes 1 enthält; . Das ist ein schwieriger Teil. Ich möchte einen sed-Befehl, der den ersten wHOLE-Übereinstimmungsfall des Wortes worker_processes findet , lösche die Textzeile, in der das Wort gefunden wird, und füge sieworker_processes 4; dort ein und speichere die Datei. Dies ist jedoch die zuverlässigste Methode beim Bearbeiten von Dateien (ohne das Risiko, dass eine Konf. Beschädigt wird)

Ein letzter Vorschlag Ich habe sed -is / enabled = 0 / enabled = 1 / g '/etc/yum.repos.d/remi.repo verwendet, um enabled = 0 in enabled = 1 im Abschnitt [remi] in remi zu ändern .repo .Jedoch habe ich das Gefühl, dass es alle aktivierten = 0 in dieser Datei ändern kann, was den Server beschädigen wird. Kann jemand einen besseren Code vorschlagen.


Ein anderes Zeug, dessen ich mir nicht sicher bin: PI möchte eine Datei bearbeiten, die dies als Text Testing = "0" hat (Ja, es hat Anführungszeichen und ich muss es behalten). Es sollte von Testing = "0" zu Testing = "geändert werden. 1 "(mit Anführungszeichen)

Außerdem muss ich Text mit Anführungszeichen am Ende einer Datei mit sed einfügen. Wie "Thanks Quanta" (mit Anführungszeichen) Für PHP setzen Sie ein \ mit echo-Anführungszeichen, wissen nicht, wie es für bash gemacht wird

Eine andere Sache, die
ich muss, um eine Zeile in einem Conf zu ändern, aber ich erinnere mich nicht, was der gesamte zu ersetzende Text ist

Wie sein Zuhören = etwas; , ich möchte es ändern, um zu hören = /tmp/php5-fpm.sock;

Daumen hoch für Quanten

Vielen Dank für die großartige Unterstützung

Werulz
quelle

Antworten:

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

Geben Sie eine direkte Bearbeitungsoption an ( -i), wenn Sie möchten (erstellt zuerst das Backup mit der .bakErweiterung):

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

Jetzt möchte ich sed verwenden, um Folgendes zu tun 1.Finden Sie das ERSTE Vorkommen von worker_processes in diesem conf und ersetzen Sie den Text durch worker_processes 4;

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

Ein letzter Vorschlag habe ich sed -i 's/enabled=0/enabled=1/g' /etc/yum.repos.d/remi.repozu ändern , enabled=0um enabled=1unter dem [remi]in Abschnitt remi.repo. Allerdings habe ich das Gefühl, dass es alles enabled=0in dieser Datei ändern kann, was den Server zerstören wird. Kann jemand einen besseren Code vorschlagen

Für Sie da:

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

Ein anderes Zeug, dessen ich mir nicht sicher bin: PI möchte eine Datei bearbeiten, die dies als Text Testing = "0" hat (Ja, es hat Anführungszeichen und ich muss es behalten). Es sollte von Testing = "0" zu Testing = "geändert werden. 1 "(mit Anführungszeichen)

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

Außerdem muss ich Text mit Anführungszeichen am Ende einer Datei mit sed einfügen. Wie "Thanks Quanta" (mit Anführungszeichen) Für PHP setzen Sie ein \ mit echo-Anführungszeichen, wissen nicht, wie es für bash gemacht wird

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

Eine andere Sache, die ich muss, um eine Zeile in einem Conf zu ändern, aber ich erinnere mich nicht, was der gesamte zu ersetzende Text ist

Wie sein Zuhören = etwas; , ich möchte es ändern, um zu hören = /tmp/php5-fpm.sock;

sed 's/listen = .*/listen = \/tmp\/php5-fpm.sock;/'
Quanten
quelle
'sed' / enabled = 1 / a \ priority = 10 '/etc/yum.repos.d/epel.repo' bearbeitet die Datei und speichert die Änderungen.Bitte bestätigen Sie
Werulz
@Werulz: Prüfen Sie einfach mit einer Datei, die keine Rolle spielt, oder kopieren Sie den Inhalt von epel.repo in eine Datei im Ausgangsverzeichnis, und versuchen Sie, sie dort ohne Root- / Superuser-Berechtigungen auszuführen.
Erik I
-iist keine Standardoption für sed. edEs bietet jedoch eine standardkonforme Möglichkeit, Dateien mit einer Syntax zu bearbeiten, die der von sed sehr ähnlich ist.
Kojiro
Ich habe meinen ersten Beitrag aktualisiert, um Sie um einen weiteren Vorschlag zu bitten. Vielen Dank für die bisherige Unterstützung.
Werulz
Ich habe den Beitrag erneut aktualisiert. Entschuldigung, dass ich so viele Fragen gestellt habe. Wird Skript mit Ihnen teilen, falls Sie brauchen
Werulz
12

Wie ptman sagte, kann Augeas Sie vor der Verwendung von sed/ retten awk:

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

setzt die Priorität des epelRepositorys auf 10. Wenn der prioritySchlüssel bereits vorhanden ist, wird sein Wert festgelegt, andernfalls wird ein priorityEintrag nach dem letzten Eintrag im Abschnitt hinzugefügt .

Gleiches gilt für andere Werte, die Sie möglicherweise ändern möchten.

Wenn Sie mehrere Werte ändern möchten, können Sie diese sogar augtoolals Interpreter verwenden:

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

Wenn Sie es in Ihrem Bash-Skript behalten möchten, können Sie die Befehle weiterleiten an 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

Siehe man augtoolfür weitere Optionen.

Augeas vs sed/ bietet mehrere Vorteile awk:

  • Augeas hat Parser, die die Dateisyntax (in diesem Fall die yum.repoSyntax) kennen. Sie gehen nicht das Risiko ein, die Dateisyntax zu brechen, wenn Ihre Regex falsch ist.
  • Der Augeas yum.repo-Parser kennt yum.repoAbschnitte, sodass Sie wissen, dass Sie den richtigen Abschnitt bearbeiten.
  • Augeas ist idempotent. Es werden nur Änderungen an der Datei vorgenommen, wenn Änderungen vorgenommen werden müssen. Wenn alle Werte bereits festgelegt sind, wird die Datei nicht geändert.
  • Augeas hat einen Puppet-Anbieter, sodass Sie dies in einer Puppet-Infrastruktur problemlos automatisieren können.
  • Wenn noch keine Parameter vorhanden sind, erstellt Augeas diese für Sie. Wenn der Abschnitt noch nicht vorhanden ist, erstellt Augeas ihn ebenfalls mit der richtigen Syntax.
ℝaphink
quelle
Vielen Dank für die Antwort ...... werde es mit Sicherheit berücksichtigen .... Kannst du ein Beispiel geben, wie es mit meinem Bash-Skript verwendet wird
Werulz
Ok, siehe meine Bearbeitung.
ℝaphink
2

Vielleicht möchten Sie auch Augeas auschecken , ein Tool zum programmgesteuerten Ändern von Konfigurationsdateien. Es ist sehr leistungsfähig in Kombination mit Puppet (einem Konfigurationsmanagementsystem), kann aber auch alleine verwendet werden.

ptman
quelle
Was ist das lol
Werulz
2
Sie können die Qualität dieser Antwort verbessern, indem Sie eine kurze Beschreibung von Augeas und ein oder zwei Beispiele hinzufügen.
ThatGraemeGuy
Ich habe eine neue Frage hinzugefügt, Jungs
Werulz