Edytuj plik za pomocą skryptu bash

12

Jestem początkującym w skryptach bash. Chcę utworzyć skrypt bash, aby zautomatyzować instalację i konfigurację rzeczy na moim Linux-ie.

Załóżmy, że chcę edytować

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

przez skrypt bash

To, co chcę zrobić, jest następujące

  1. Otwórz plik /etc/yum.repos.d/epel.repo
  2. Znajdź sekcję [epel]
  3. Dodaj priorytet linii = 10 zaraz po włączeniu linii = 1 w sekcji epel

Do pierwszej części dodałem

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

Moje pytanie brzmi: jak zrobić 2 i 3 część za pomocą skryptu bash za pomocą nano (jeśli to możliwe, jeśli nie jest to możliwe, pokaż mi sed)

Również w niektórych punktach będę musiał zmodyfikować zmienne w plikach np

  1. enable = 0, aby włączyć = 1
  2. Testowanie = „1” na Testowanie = „0”
  3. Dodaj tekst w linii. Funkcje = do funkcji = „tekst1”, „tekst2”
  4. Dodaj tekst do pliku i zapisz go (za pomocą nano)

Wiem, że jest to wymagające, ale muszę to stworzyć dla przyjaciela, który jest noobem w zarządzaniu serwerem. Niestety nie mam czasu na studiowanie skryptów bash od samego początku, gdy moje egzaminy są jak najbliżej. Użyję twoich przykładów do napisania skryptu.


Dzięki chłopaki za wszystkie odpowiedzi, które udało mi się wykonać w większości skrypt bash

Jednak mam inny problem Pozwala Załóżmy, że chcesz zmodyfikować nginx.conf korzystając sed Zajmiemy się worker_processes
Teraz chcę użycie sed wykonać następujące 1.Find do pierwszego wystąpienia z worker_processes tym, że conf i zamienić tekst zworker_processes 4;

Uwaga specjalna: to tylko przykład. Może się zdarzyć, że conf zawiera proces_procesowy 1; . To trudna część. Chcę polecenia sed, które wyszukuje PIERWSZĄ WHOLE wielkość dopasowania słowa pracownik_procesy , usuwa wiersz tekstu, w którym znajduje się słowo, i wkleja worker_processes 4;tam, a następnie zapisuje plik. Jest to najbardziej niezawodna metoda, z której korzystałem podczas edytowania plików (bez ryzyka złamania jakiejkolwiek konf

Ostatnia sugestia, której użyłem sed -i 's / enabled = 0 / enabled = 1 / g' /etc/yum.repos.d/remi.repo, aby zmienić włączony = 0 na włączony = 1 w sekcji [remi] w remi .repo. Mam jednak wrażenie, że może zmodyfikować wszystkie włączone = 0 w tym pliku, co spowoduje uszkodzenie serwera. Czy ktoś może zaproponować lepszy kod.


Kolejna sprawa, której nie jestem pewien: PI chcę edytować plik, który ma to jako Test tekstowy = „0” (Tak, ma cytaty i muszę go zachować). Należy zmienić z Testowanie = „0” na Testowanie = ” 1 "(z cytatami)

Również muszę dodać tekst z cudzysłowami na końcu pliku za pomocą sed, np. „Thanks Quanta” (z cytatem) W przypadku php wstawiasz \ z echami, nie wiem jak to zrobić dla bash

Kolejną rzeczą,
którą muszę zmodyfikować wiersz w conf, ale nie pamiętam, co to jest cały tekst do zastąpienia

Jak jego słuchanie = coś; , chcę to zmodyfikować, aby słuchać = /tmp/php5-fpm.sock;

Wielkie kciuki do góry za kwanty

Dzięki za niesamowite wsparcie chłopaki

Werulz
źródło

Odpowiedzi:

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

W -irazie potrzeby określ opcję edycji lokalnej ( ) ( najpierw wykonaj kopię zapasową z .bakrozszerzeniem):

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

Teraz chcę użyć sed, aby wykonać następujące czynności: 1. Znajdź PIERWSZE wystąpienie procesów_procesowych w tej konf i zamień tekst na proces_procesowy 4;

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

Ostatnia sugestia, którą sed -i 's/enabled=0/enabled=1/g' /etc/yum.repos.d/remi.repozmieniłem enabled=0na enabled=1pod [remi]sekcją w remi.repo. Mam jednak wrażenie, że może zmodyfikować wszystko enabled=0w tym pliku, co spowoduje uszkodzenie serwera. Czy ktoś może zaproponować lepszy kod

Tu dla Ciebie:

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

Kolejna rzecz, której nie jestem pewien: PI chcę edytować plik, który ma to jako Test tekstowy = „0” (Tak, ma cytaty i muszę go zachować). Należy zmienić z Testowanie = „0” na Testowanie = ” 1 "(z cytatami)

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

Również muszę dodać tekst z cudzysłowami na końcu pliku za pomocą sed, np. „Thanks Quanta” (z cytatem) W przypadku php wstawiasz \ z echami, nie wiem jak to zrobić dla bash

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

Kolejną rzeczą, którą muszę zmodyfikować wiersz w conf, ale nie pamiętam, co to jest cały tekst do zastąpienia

Jak jego słuchanie = coś; , chcę to zmodyfikować, aby słuchać = /tmp/php5-fpm.sock;

sed 's/listen = .*/listen = \/tmp\/php5-fpm.sock;/'
kwanty
źródło
'sed' / enabled = 1 / a \ Priority = 10 '/etc/yum.repos.d/epel.repo' edytuje plik i zapisze zmiany. Proszę potwierdzić
Werulz
@Werulz: Po prostu sprawdź plik, który nie ma znaczenia, lub skopiuj zawartość pliku epel.repo do pliku w katalogu domowym i spróbuj uruchomić go tam bez uprawnień administratora / administratora.
Erik I
-inie jest standardową opcją dla sed. edoferuje jednak zgodny ze standardami sposób edycji plików o składni bardzo podobnej do sed.
kojiro
Zaktualizowałem swój pierwszy post, aby poprosić o kolejną sugestię. Bardzo dziękuję za wsparcie do tej pory kwanty.
Werulz
Zaktualizowałem post jeszcze raz ... przepraszam, że zadałem tyle pytań.
Udostępni
12

Jak powiedział Ptman, Augeas może cię uratować przed użyciem sed/ awk:

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

ustawi priorytet epelrepozytorium na 10. Jeśli priorityklucz już istnieje, ustawi jego wartość, w przeciwnym razie doda prioritywpis po ostatnim wpisie w sekcji.

To samo dotyczy innych wartości, które możesz chcieć zmodyfikować.

Jeśli chcesz zmodyfikować kilka wartości, możesz nawet użyć go augtooljako interpretera:

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

Jeśli chcesz zachować to w skrypcie bash, możesz potokować polecenia w 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

Zobacz man augtoolwięcej opcji.

Istnieje kilka zalet korzystania z Augeas vs sed/ awk:

  • Augeas ma parsery, które wiedzą o składni pliku (w tym przypadku yum.reposkładni). Nie będziesz ryzykować zerwania składni pliku, jeśli twoje wyrażenia regularne są niepoprawne;
  • parser Augeas yum.repo wie o yum.reposekcjach, więc wiesz, że edytujesz odpowiednią sekcję;
  • Augeas jest idempotentny. Wprowadzi zmiany w pliku tylko wtedy, gdy zostaną wprowadzone zmiany. Jeśli wszystkie wartości są już ustawione, nie zmodyfikuje pliku;
  • Augeas ma dostawcę Puppet, więc możesz łatwo zautomatyzować to w infrastrukturze Puppet;
  • jeśli parametry jeszcze nie istnieją, Augeas utworzy je dla Ciebie. Jeśli sekcja jeszcze nie istnieje, Augeas również ją utworzy z odpowiednią składnią.
Inkaphink
źródło
Dzięki za odpowiedź ...... na pewno to rozważy ... Czy możesz podać przykład, jak używać go z moim skryptem bash
Werulz
Ok, zobacz moją edycję.
inkaphink
2

Możesz także wypróbować Augeas , narzędzie do programowej modyfikacji plików konfiguracyjnych. Jest bardzo wydajny w połączeniu z Puppet (system zarządzania konfiguracją), ale może być również używany samodzielnie.

ptman
źródło
Co to za lol
Werulz
2
Możesz poprawić jakość tej odpowiedzi, podając krótki opis tego, czym jest / robi Augeas, a także dodając przykład lub dwa.
ThatGraemeGuy
Dodałem nowe pytanie chłopaki
Werulz