Edit file melalui skrip bash

12

Saya seorang pemula dalam skrip bash. Saya ingin membuat skrip bash untuk menginstal menginstal dan mengkonfigurasi barang-barang di kotak linux saya dengan cara otomatis.

Misalkan saya ingin mengedit

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

oleh skrip bash

Yang ingin saya lakukan adalah sebagai berikut

  1. Buka file /etc/yum.repos.d/epel.repo
  2. Temukan bagian [epel]
  3. Tambahkan prioritas baris = 10 setelah baris diaktifkan = 1 di bagian epel

Untuk bagian pertama saya menambahkan

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

Pertanyaan saya adalah bagaimana melakukan bagian 2 dan 3 dengan skrip bash menggunakan nano (jika mungkin, kalau-kalau tidak mungkin tunjukkan dengan sed)

Juga di beberapa titik saya harus memodifikasi variabel dalam file Untuk misalnya

  1. aktifkan = 0 untuk mengaktifkan = 1
  2. Menguji = "1" ke Menguji = "0"
  3. Tambahkan teks dalam satu baris. functions = to function = "text1", "text2"
  4. Tambahkan beberapa teks ke file dan simpan (dengan nano)

Saya tahu ini menuntut tetapi saya harus membuat ini untuk seorang teman yang noob di manajemen server. Sayangnya saya tidak punya waktu untuk mempelajari skrip bash dari awal karena ujian saya sudah dekat. Saya akan menggunakan contoh Anda untuk menulis skrip.


Guys terima kasih untuk semua balasan saya telah berhasil melakukan sebagian besar skrip bash

Namun saya telah masalah lain Mari kira saya ingin memodifikasi nginx.conf menggunakan sed Kami akan berurusan dengan worker_processes
Sekarang saya ingin menggunakan sed melakukan 1.Find mengikuti terjadinya PERTAMA dari worker_processes di conf itu dan mengganti teks denganworker_processes 4;

Catatan Khusus Di Sini: Ini hanya sebuah contoh. Ini mungkin terjadi bahwa conf berisi pekerja_proses 1; . Ini bagian yang sulit. Saya ingin perintah sed yang menemukan kasus pertandingan WHOLE PERTAMA dari kata worker_processes , hapus baris teks di mana kata itu ditemukan dan dan tempel di worker_processes 4;sana kemudian simpan file. Ini adalah metode yang paling dapat diandalkan saat mengedit file (tanpa risiko melanggar conf

Satu saran terakhir saya menggunakan sed - i 's / enabled = 0 / enabled = 1 / g' /etc/yum.repos.d/remi.repo untuk mengubah diaktifkan = 0 menjadi diaktifkan = 1 di bawah bagian [remi] di remi .repo .Namun saya punya perasaan bahwa itu dapat memodifikasi semua diaktifkan = 0 dalam file itu, yang akan mendatangkan server. Bisakah ada yang menyarankan kode yang lebih baik.


Hal lain yang saya tidak yakin: PI ingin mengedit file yang memiliki ini sebagai Pengujian Teks = "0" (Ya itu memiliki tanda kutip dan saya harus menyimpannya) Itu harus dimodifikasi dari Pengujian = "0" untuk Pengujian = " 1 "(dengan kutipan)

Juga saya perlu menambahkan beberapa teks dengan tanda kutip di akhir file dengan sed Seperti "Terima kasih Quanta" (dengan kutipan) Untuk php Anda meletakkan \ dengan tanda kutip bergema, tidak tahu bagaimana hal itu dilakukan untuk bash

Hal lain yang
perlu saya modifikasi adalah baris dalam conf tetapi saya tidak ingat apa yang harus diganti seluruh teks

Suka mendengarkannya = sesuatu; , saya ingin memodifikasinya untuk mendengarkan = /tmp/php5-fpm.sock;

Jempol besar untuk kuanta

Terima kasih untuk dukungan kalian yang luar biasa

Werulz
sumber

Jawaban:

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

Tentukan opsi pengeditan di tempat ( -i) jika Anda mau (buat cadangan dengan .bakekstensi terlebih dahulu):

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

Sekarang saya ingin menggunakan sed untuk melakukan hal berikut: 1. Temukan terjadinya pertama dari proses pekerja_ dalam conf itu dan ganti teks dengan pekerja_proses 4;

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

Satu saran terakhir saya digunakan sed -i 's/enabled=0/enabled=1/g' /etc/yum.repos.d/remi.repountuk mengubah enabled=0ke enabled=1bawah [remi]bagian dalam remi.repo. Namun saya punya perasaan bahwa itu dapat memodifikasi semua enabled=0dalam file itu, yang akan mendatangkan server. Bisakah ada yang menyarankan kode yang lebih baik

Di sini untukmu:

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

Hal lain yang saya tidak yakin: PI ingin mengedit file yang memiliki ini sebagai Pengujian Teks = "0" (Ya itu memiliki tanda kutip dan saya harus menyimpannya) Itu harus dimodifikasi dari Pengujian = "0" untuk Pengujian = " 1 "(dengan kutipan)

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

Juga saya perlu menambahkan beberapa teks dengan tanda kutip di akhir file dengan sed Suka "Terima kasih Quanta" (dengan kutipan) Untuk php Anda meletakkan \ dengan tanda kutip bergema, tidak tahu bagaimana hal itu dilakukan untuk bash

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

Hal lain yang perlu saya modifikasi adalah baris dalam conf tetapi saya tidak ingat apa yang harus diganti seluruh teks

Suka mendengarkannya = sesuatu; , saya ingin memodifikasinya untuk mendengarkan = /tmp/php5-fpm.sock;

sed 's/listen = .*/listen = \/tmp\/php5-fpm.sock;/'
kuanta
sumber
'sed' / enabled = 1 / a \ priority = 10 '/etc/yum.repos.d/epel.repo' akan mengedit file dan menyimpan perubahan. Konfirmasi
silakan
@Werulz: Cukup periksa dengan file yang tidak masalah atau salin isi epel.repo ke file di direktori home dan coba jalankan di sana tanpa hak root / superuser.
Erik I
-ibukan opsi standar untuk sed. edNamun, menawarkan cara yang sesuai standar untuk mengedit file dengan sintaksis yang sangat mirip dengan sed.
kojiro
Saya memperbarui posting pertama saya untuk menanyakan saran lain kepada Anda. Terima kasih banyak atas dukungannya sejauh ini.
Werulz
Saya memperbarui posting lagi ...... maaf telah mengajukan begitu banyak pertanyaan. Akan berbagi skrip dengan Anda jika Anda perlu
Werulz
12

Seperti kata ptman, Augeas dapat menyelamatkan Anda dari menggunakan sed/ awk:

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

akan mengatur prioritas epelrepositori ke 10. Jika prioritykunci sudah ada, ia akan menetapkan nilainya, jika tidak maka akan menambah priorityentri setelah entri terakhir di bagian tersebut.

Hal yang sama berlaku untuk nilai-nilai lain yang mungkin ingin Anda ubah.

Jika Anda ingin mengubah beberapa nilai, Anda bahkan dapat menggunakan augtoolsebagai juru bahasa:

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

Jika Anda ingin menyimpannya di skrip bash Anda, Anda dapat menyalurkan perintah ke 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

Lihat man augtoolopsi lainnya.

Ada beberapa keuntungan menggunakan Augeas vs sed/ awk:

  • Augeas memiliki parser yang tahu tentang sintaks file (dalam hal ini, yum.reposintaks). Anda tidak akan mengambil risiko melanggar sintaksis file jika regex Anda salah;
  • parser Augeas yum.repo tahu tentang yum.repobagian, sehingga Anda tahu bahwa Anda mengedit bagian yang benar;
  • Augeas idempoten. Itu hanya akan membuat perubahan pada file jika ada perubahan yang harus dilakukan. Jika semua nilai sudah ditetapkan, itu tidak akan mengubah file;
  • Augeas memiliki penyedia Wayang, sehingga Anda dapat dengan mudah mengotomatisasi ini dalam infrastruktur Wayang;
  • jika parameter belum ada, Augeas akan membuatnya untuk Anda. Jika bagian tersebut belum ada, Augeas juga akan membuatnya, dengan sintaks yang tepat.
ℝaphink
sumber
Terima kasih atas jawabannya ...... pasti akan mempertimbangkannya .... Bisakah Anda memberikan contoh bagaimana menggunakannya dengan skrip bash saya
Werulz
Oke, lihat edit saya.
ℝaphink
2

Anda mungkin juga ingin memeriksa Augeas , alat untuk memodifikasi file konfigurasi secara terprogram. Ini sangat kuat dalam kombinasi dengan Puppet (sistem manajemen konfigurasi), tetapi juga dapat digunakan dengan sendirinya.

PTman
sumber
Apa itu lol
Werulz
2
Anda dapat meningkatkan kualitas jawaban ini dengan memberikan deskripsi singkat tentang apa yang Augeas / lakukan, dan juga dengan menambahkan satu atau dua contoh.
ThatGraemeGuy
Saya menambahkan pertanyaan baru
kawan