Saya mencari bantuan dengan skrip kecil.
Saya ingin mencari semua file yang terkait
/usr/local/directadmin/data/users/*/httpd.conf
untuk string
centralized.log
Jika string tidak ada dalam file, saya ingin memasukkan 2 baris ke dalamnya.
Saat ini saya memiliki skrip berikut:
#!/bin/bash
if ! grep -q centralized.log /usr/local/directadmin/data/users/*/httpd.conf ; then
sed -i '33iCustomLog /var/log/centralized.log combined' /usr/local/directadmin/data/users/*/httpd.conf && sed -i '65iCustomLog /var/log/centralized.log combined' /usr/local/directadmin/data/users/*/httpd.conf
fi
Saat ini, jika string tidak ditemukan di salah satu file, garis dimasukkan ke semua file, dan jika string ditemukan di setidaknya satu file, tidak ada yang terjadi. Bisakah saya membuatnya sehingga baris bisa ditambahkan ke semua file di mana string tidak ada?
for
lingkaran, misalnyafor f in /usr/local/directadmin/data/users/*/httpd.conf ; do if ! grep -q centralized.log "$f" ; then sed -i ... "$f" ; fi ; done
.Jawaban:
Ini harus melakukan trik:
Anda dapat menyatukan kedua garis sed, tetapi saya tetap sedekat mungkin dengan contoh Anda.
sumber
Ini hanya mengulangi semua file yang terdaftar oleh
grep
. Saya pikir ini lebih mudah dibaca dengan cara ini.EDIT: versi tangguh
Lihat jawaban ini untuk memahami hal di atas dengan lebih baik.
EDIT2: Semoga ini akan memuaskan @ alex-stragies. Terus edit sebelumnya untuk catatan.
Jika pengguna dapat diberi nama dengan
%
char, ubah saja sesuai keinginan.sumber
-q
argumen sampai pertanyaan ini. Ini karena saya pikir lebih baik untuk abstrak sendiri dari masalah: daripada berkomunikasi dengan grep (melalui-q
danif
), Saya "hanya ingin" itu daftar file (untuk file dalam "daftar khusus yang ditentukan").