Bagaimana saya bisa membedakan dua file konfigurasi?

15

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?

jldugger
sumber
1
Awas jldugger! Anda akan melakukannya level! =)
Xerxes
Ini benar-benar ide yang buruk untuk menghapus komentar, bagaimana Anda tahu itu tidak relevan tanpa melihatnya?
AnonymousLurker

Jawaban:

15
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.

Xerxes
sumber
+1 untuk menyediakan solusi garis tunggal
wzzrd
Adakah ide tentang cara menghilangkan garis yang mengandung spasi juga? Ternyata setelah Anda memotong komentar, ada banyak garis kosong yang memberi jarak.
jldugger
@ jldugger, coba perbarui grep menjadi seperti ini untuk mengecualikan komentar dan spasi putih. - egrep -v '^ (#. * |) $'
Zoredache
19

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

rgmarcha
sumber
6

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

Mark Norgren
sumber
Beyond Compare is awesome!
Clinton Blackmore
apakah ini tersedia di sistem * nix?
Preet Sangha
Beyond Compare 3 tidak berjalan sebagai aplikasi konsol di Linux. Itu membutuhkan X-Windows. Distribusi Linux yang didukung (32-bit) Red Hat Enterprise Linux 4, 5 Fedora 4 - 10 Novell Suse Linux Enterprise Desktop 10 openSUSE 10.3, 11 Ubuntu 6.06 - 8.10 Tidak Diuji Apa pun Kernel Linux 64-bit Tidak Kompatibel Red Hat Enterprise Linux 3
Mark Norgren
Saya tidak bisa hidup tanpa alat ini lagi! Penghemat waktu yang ekstrem. Ketika saya berganti dari PC ke Mac sekitar 1 tahun yang lalu saya sangat senang mengetahui bahwa itu baru saja porting ke Mac juga.
Jpsy
5

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.

Rob Chanter
sumber
+1 untuk berbaur, yang telah membuat pembacaan grafis jadi sangat mudah.
Avery Payne
4

Setelah membersihkan komentar, saya akan menyarankan menggunakan KDiff3, itu alat diff / merge yang cukup bagus dan Anda tidak perlu vim fu untuk menggunakannya :)


sumber
3

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
jj33
sumber
2

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 diffke vimdiffatau gvimdiffyang kedua datang dengan vim.

Neil
sumber
2

Memperluas solusi Xerxes, Anda dapat menggunakan alat yang lebih canggih daripada diffuntuk menampilkan perbedaan.

wdiff

wdiffkadang-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 wdiffsebelum menggunakan skrip ini.

Meld

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)
akaihola
sumber
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).

Oriettaxx
sumber
1

Ini sama dengan nima's one liner, tetapi akan menyaring garis kosong juga seperti yang diminta seseorang.

diff -u <(egrep -v '^(#| *$)' f1) <(egrep -v '^(#| *$)' f2)

(Saya juga akan menginstal colordiff jika mungkin dan menggunakannya sebagai pengganti diff normal)

Menandai
sumber
1

Saya menggunakan WinMerge http://winmerge.org untuk meng-diff file, dengan syarat saya harus menariknya ke mesin saya, tetapi itu berfungsi untuk.

steve.lippert
sumber