Bir dosyayı bash betiği ile düzenleme


12

Ben bash komut dosyasında bir acemi değilim. Linux kutuma otomatik olarak yüklemek ve yapılandırmak için bir bash betiği oluşturmak istiyorum.

Diyelim ki düzenlemek istiyorum

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

bash betiği tarafından

Yapmak istediğim şu

  1. /Etc/yum.repos.d/epel.repo dosyasını aç
  2. [Epel] bölümünü bul
  3. Epel bölümünde bir satır önceliği = 10 satır etkinleştirildikten hemen sonra = 1 ekleyin

İlk bölüm için ekledim

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

Benim sorum nano kullanarak bash betiği ile 2 ve 3. bölüm nasıl yapılır (mümkünse, mümkün değilse bana sed ile göster)

Ayrıca bazı noktalarda dosyalarda değişkenleri değiştirmek zorunda kalacak

  1. enable = 0 etkinleştirmek için = 1
  2. Test = "1" ile Test = "0"
  3. Bir satıra metin ekleyin. fonksiyonlar = fonksiyon = "metin1", "metin2"
  4. Bir dosyaya metin ekleyin ve kaydedin (nano ile)

Ben onun zorlu biliyorum ama ben sunucu yönetimi noob olan bir arkadaş için bu oluşturmak gerekir. Ne yazık ki ben bash komut dosyaları en yakın sınavları gibi baştan çalışmak için zamanım yok. Ben senaryo yazmak için örneklerinizi kullanacaktır.


Çocuklar bash senaryosunun çoğunu başarıyla yaptığım tüm cevaplar için teşekkürler

Ancak ben başka sorun i Biz worker_processes ele alınacaktır sed kullanarak nginx.conf değiştirmek istediğiniz varsayalım Lets gelmiş
kullanımı şu 1.Find yapmak sed Şimdi ben istiyorum İLK oluşumunu ait worker_processes olduğunu Konfigürasyon ve metinle değiştirmeworker_processes 4;

Burada Özel Not: Bu sadece bir örnektir. Konf işçi_işlemleri 1 içerebilir; . Bu zor bir bölüm. Ben bulmak bir sed komutu istiyorum İLK bütün maç dava kelime arasında worker_processes kelime bulundu ve yapıştır edilir metnin silme hattı worker_processes 4;dosyayı kaydetmektedir orada ve o zaman. Bu, dosyaları düzenlerken en güvenilir yöntemdir (herhangi bir konuyu kırma riski olmadan)

Remi'deki [remi] bölümünde etkin = 0'ı etkin = 1 olarak değiştirmek için sed -i 's / etkin = 0 / etkin = 1 / g' /etc/yum.repos.d/remi.repo kullandığım son bir öneri .repo .However bu sunucuda tüm etkin = 0 değiştirebilir bir duygu var, hangi sunucu wreak.Kimsi ​​daha iyi bir kod önerebilir miyim.


Emin değilim başka bir şey: PI bunu Metin Test = "0" olarak sahip bir dosyayı düzenlemek istiyorum (Evet tırnak vardır ve bunu tutmak gerekir) Testing = "0" Testing = "değiştirilmelidir 1 "(tırnak işaretleri ile)

Ayrıca sed ile bir dosyanın sonunda tırnak ile bazı metin eklemeniz gerekiyor "Teşekkürler Quanta" gibi (alıntı ile) Php için yankı tırnak ile bir \ koymak, bash için nasıl yapıldığını bilmiyorum

Başka bir şey
bir conf bir satır değiştirmek gerekiyor ama değiştirilecek metnin bütün ne olduğunu hatırlamıyorum

Dinlemesi gibi = bir şey; , dinlemek için değiştirmek istiyorum = /tmp/php5-fpm.sock;

Büyük başparmak yukarıya için quanta

Müthiş destek adamları için teşekkürler

Yanıtlar:


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

-iİsterseniz bir yerinde düzenleme seçeneği ( ) belirtin ( .bakönce uzantıyla yedeklemeyi yapar ):

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

Şimdi sed yapmak istiyorum sed 1. 1.Find conf işçi worker_processes oluşumunu bulmak ve worker_processes 4 ile metin yerine;

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

Son bir öneri kullandığım sed -i 's/enabled=0/enabled=1/g' /etc/yum.repos.d/remi.repodeğiştirmek enabled=0için enabled=1altında [remi]bölümüne remi.repo. Ancak ben enabled=0sunucuyu wreak olacak bu dosya, tüm değiştirebilir bir duygu var. Herkes daha iyi bir kod önerebilir miyim

İşte senin için:

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

Emin değilim başka bir şey: PI bunu Metin Test = "0" olarak sahip bir dosyayı düzenlemek istiyorum (Evet tırnak vardır ve bunu tutmak gerekir) Testing = "0" Testing = "değiştirilmelidir 1 "(tırnak işaretleri ile)

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

Ayrıca sed ile bir dosyanın sonunda tırnak ile bazı metin eklemeniz gerekiyor "Teşekkürler Quanta" gibi (alıntı ile) Php için yankı tırnak ile bir \ koymak, bash için nasıl yapıldığını bilmiyorum

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

Başka bir şey bir conf bir satır değiştirmek gerekiyor ama değiştirilecek metnin bütün ne olduğunu hatırlamıyorum

Dinlemesi gibi = bir şey; , dinlemek için değiştirmek istiyorum = /tmp/php5-fpm.sock;

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

'sed' / etkin = 1 / a \ öncelik = 10 '/etc/yum.repos.d/epel.repo' dosyayı düzenleyecek ve değişiklikleri kaydedecektir.Onaylayın
Werulz

@Werulz: Önemli olmayan bir dosya ile kontrol edin veya epel.repo içeriğini giriş dizinindeki bir dosyaya kopyalayın ve orada root / süper kullanıcı ayrıcalıkları olmadan çalıştırmayı deneyin.
Erik I

-iBir değil , standart bir seçenek için sed. edancak sed'lere çok benzeyen sözdizimi ile dosyaları düzenlemek için standartlara uygun bir yol sunar.
kojiro

Size başka bir öneri sormak için ilk yazımı güncelledim. Şimdiye kadar destek için çok teşekkürler
Werulz

Ben tekrar yazı güncellenmiş ...... çok soru sorduğum için üzgünüm. Sen u gerek durumunda senaryoyu sizinle paylaşacak
Werulz

12

Ptman Dediğim gibi, Augeas kullanmanızı kaydedebilirsiniz sed/ awk:

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

epeldeponun önceliğini 10 olarak ayarlar . priorityAnahtar zaten varsa, değerini ayarlar, aksi takdirde prioritybölümdeki son girişten sonra bir girdi ekler .

Aynı şey, değiştirmek isteyebileceğiniz diğer değerler için de geçerlidir.

Birkaç değeri değiştirmek isterseniz, augtooltercüman olarak da kullanabilirsiniz :

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

Eğer bunu bash betiğinizde tutmak istiyorsanız, komutları birbirine bağlayabilirsiniz 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

Daha man augtoolfazla seçenek için bkz .

Augeas vs sed/ kullanmanın birkaç avantajı vardır awk:

  • Augeas, dosya sözdizimini (bu durumda yum.reposözdizimi) bilen ayrıştırıcılara sahiptir . Normal ifadeniz yanlışsa dosya sözdizimini bozma riskini almazsınız;
  • Augeas yum.repo ayrıştırıcısı yum.repobölümleri bilir , böylece doğru bölümü düzenlediğinizi bilirsiniz;
  • Augeas idempotent. Yalnızca değişiklik yapılacaksa dosyada değişiklik yapar. Tüm değerler önceden ayarlanmışsa, dosyayı değiştirmez;
  • Augeas'ın bir Kukla sağlayıcısı vardır, böylece bunu bir Kukla altyapısında kolayca otomatikleştirebilirsiniz;
  • parametreler henüz mevcut değilse, Augeas bunları sizin için oluşturacaktır. Bölüm henüz mevcut değilse, Augeas uygun sözdizimi ile de oluşturacaktır.

Cevabınız için teşekkürler ...... kesin olarak ele alacak .... u benim bash komut dosyası ile nasıl kullanılacağına bir örnek verebilir
Werulz

Tamam, düzenlememe bakın.
inkaphink

2

Yapılandırma dosyalarını programlı olarak değiştirmek için kullanılan araç olan Augeas'a da göz atmak isteyebilirsiniz . Kukla (konfigürasyon yönetim sistemi) ile birlikte çok güçlüdür , ancak kendi başına da kullanılabilir.


Bu lol nedir
Werulz

2
Augeas'ın ne olduğu hakkında kısa bir açıklama sağlayarak ve ayrıca bir veya iki örnek ekleyerek bu yanıtın kalitesini artırabilirsiniz.
ThatGraemeGuy

Yeni bir soru ekledim çocuklar
Werulz
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.