Saya punya dua file snmpd.conf, satu di server yang berfungsi, dan satu yang tidak. Bagaimana saya bisa membedakan kedua file konfigurasi sambil menghapus komentar dan baris baru yang tidak relevan?
Saya punya dua file snmpd.conf, satu di server yang berfungsi, dan satu yang tidak. Bagaimana saya bisa membedakan kedua file konfigurasi sambil menghapus komentar dan baris baru yang tidak relevan?
Jawaban:
diff <(grep -v '^#' f1) <(grep -v '^#' f2)
Untuk menghindari garis-garis kosong, dan garis-garis yang tidak mengandung apa-apa selain spasi, di samping garis identik yang memiliki satu perbedaan tambahan ruang-ruang utama ...
diff -b \
<(grep -vE '^([ \t]*#|^[ \t]*$)' f1)\
<(grep -vE '^([ \t]*#|^[ \t]*$)' f2)
Pada titik ini, saya mungkin akan memasukkannya ke dalam skrip dan menulis sesuatu seperti saran asli yang sedikit lebih mudah dibaca.
Jika Anda agak nyaman dengan vim , saya akan sangat menyarankan Anda untuk menggunakan vimdiff :
vimdiff file1 file2
Ini akan membuka sesi vim dengan dua panel, dengan satu file di setiap sisi. Sorotan dan warna akan menunjukkan perbedaan antara file, dan semua bagian yang identik akan disembunyikan (dilipat, tetapi dapat diperluas).
Kemudian, jika Anda ingin secara selektif menggabungkan perbedaan dari satu file ke yang lain, Anda dapat menggunakan perintah berikut:
(Pertimbangkan "file saat ini" sebagai tempat kursor berada)
^ W ^ W untuk mengubah fokus dari jendela satu file ke jendela file lainnya
] c untuk maju ke blok berikutnya dengan perbedaan
[c untuk membalikkan pencarian untuk blok sebelumnya dengan perbedaan
melakukan ( d IFF o btain) untuk membawa perubahan dari file lain ke file saat ini
dp ( d iff p ut) untuk mengirim perubahan dari file saat ini ke file lainnya
Catatan: Kedua lakukan dan dp pekerjaan jika Anda berada di blok atau hanya satu baris di bawah blok.
u untuk u ndo
z untuk membuka / menyembunyikan teks
zc untuk melipat kembali / menyembunyikan kembali teks
zr akan membuka kedua file sepenuhnya (gunakan : bantu lipat untuk lebih banyak tentang melipat)
: diffupdate akan memindai ulang file untuk melihat perubahan
Saat Anda mulai memindahkan teks yang diubah atau membawa perubahan, bagian file yang sekarang identik akan secara otomatis terlipat juga.
Setelah selesai, Anda dapat keluar dan menulis kedua file dengan : xa!
Anda juga dapat menulis, berhenti, membuang perubahan, dll., Satu panel pada satu waktu seperti yang biasa Anda lakukan dengan vim.
Anda dapat menggunakan semua perintah vim umum untuk mengedit file sesuka hati; Saya hanya menggambarkan perintah yang paling umum dan berguna yang mungkin Anda gunakan dalam sesi vimdiff (sebagai lawan dari vim generik).
Beyond Compare adalah alat pamungkas untuk ini!
Tautan: http://www.scootersoftware.com/
Tersedia untuk Windows dan Linux.
Jeff menulis artikel ikhtisar yang baik tentang alat tersebut beberapa waktu lalu:
http://www.codinghorror.com/blog/archives/000454.html
Memperluas pada one-liner nima, Anda bisa melakukannya sebagai fungsi shell dan meletakkannya di .bashrc Anda
diff <(grep -v '^#' f1) <(grep -v '^#' f2)
menjadi (menggunakan -u karena saya suka uns diff)
function cleandiff {
diff -u <(grep -v '^#' $1| grep -v '^ *$') <(grep -v '^#' $2 | grep -v '^ *$')
}
Jika Anda menyukai pemirsa GUI diff, berbaur itu bagus, dan memahami dirs / file yang dikendalikan revisi.
Setelah membersihkan komentar, saya akan menyarankan menggunakan KDiff3, itu alat diff / merge yang cukup bagus dan Anda tidak perlu vim fu untuk menggunakannya :)
Mungkin ada cara yang lebih elegan untuk melakukannya, tetapi secara pragmatis (dan cepat):
grep -v '^#' server1-snmpd.conf | grep -v '^ *$' > server1-snmpd.conf-clean
grep -v '^#' server2-snmpd.conf | grep -v '^ *$' > server2-snmpd.conf-clean
diff server1-snmpd.conf-clean server2-snmpd.conf-clean
Jika Anda menggunakan shell mirip bash, Anda dapat mencoba ini:
# Name this diff-stripped
STRIPPED=
for i in $*; do
egrep -v "^#|^\s*" "$i" > "$i.stripped"
STRIPPED="$STRIPPED $i.stripped"
done
diff $STRIPPED
Kemudian panggil seperti ini:
diff-stripped file1 file2 ...
Anda juga dapat mengubah diff
ke vimdiff
atau gvimdiff
yang kedua datang dengan vim
.
Memperluas solusi Xerxes, Anda dapat menggunakan alat yang lebih canggih daripada diff
untuk menampilkan perbedaan.
wdiff
kadang-kadang bisa "terlalu pintar", tetapi saya merasa sering berguna untuk melihat perbedaan antara file konfigurasi dengan cepat. Script ini dapat digunakan untuk output dengan warna:
#!/bin/bash
RED=$'\e'"[1;31m"
GREEN=$'\e'"[1;32m"
RESET=$'\e'"[0m"
WDIFF_ARGS="-w$RED -x$RESET -y$GREEN -z$RESET --avoid-wraps"
wdiff $WDIFF_ARGS \
<(grep -vE '^([ \t]*#|^[ \t]*$)' $1) \
<(grep -vE '^([ \t]*#|^[ \t]*$)' $2) \
| less -R
Di Ubuntu dan sistem berbasis Debian lainnya, sesaat apt-get install wdiff
sebelum menggunakan skrip ini.
Meld adalah alternatif GUI yang bagus, tetapi fitur "Penyaringan teks" memiliki beberapa masalah. Alih-alih menggunakan pemfilteran teks, saya menghapus komentar sama sekali sebelum menampilkan hasilnya di Meld. Kekurangannya adalah kehilangan kemampuan untuk mengedit file sambil membandingkannya. Berikut ini skrip sederhana untuk menggunakan Meld:
#!/bin/bash
meld <(grep -vE '^([ \t]*#|^[ \t]*$)' $1) \
<(grep -vE '^([ \t]*#|^[ \t]*$)' $2)
Kadang-kadang, beberapa baris umum tambahan dapat dihapus dengan menyortir file sebelum diff, jadi saya akan menambahkan apa yang sudah ditulis sebagai berikut:
diff <(grep -v '^#' f1 | sort) <(grep -v '^#' f2 | sort)
ini tentu saja masuk akal untuk file di mana urutan baris tidak mempengaruhi kontennya (jadi waspadalah).
Saya menggunakan WinMerge http://winmerge.org untuk meng-diff file, dengan syarat saya harus menariknya ke mesin saya, tetapi itu berfungsi untuk.
level
! =)