ฉันมีไฟล์ snmpd.conf สองไฟล์ไฟล์หนึ่งอยู่บนเซิร์ฟเวอร์ที่ใช้งานได้และไฟล์หนึ่งที่ไม่ได้ ฉันจะแตกไฟล์กำหนดค่าทั้งสองนี้อย่างไรในขณะที่แยกความคิดเห็นที่ไม่เกี่ยวข้องและขึ้นบรรทัดใหม่ได้อย่างไร
ฉันมีไฟล์ snmpd.conf สองไฟล์ไฟล์หนึ่งอยู่บนเซิร์ฟเวอร์ที่ใช้งานได้และไฟล์หนึ่งที่ไม่ได้ ฉันจะแตกไฟล์กำหนดค่าทั้งสองนี้อย่างไรในขณะที่แยกความคิดเห็นที่ไม่เกี่ยวข้องและขึ้นบรรทัดใหม่ได้อย่างไร
คำตอบ:
diff <(grep -v '^#' f1) <(grep -v '^#' f2)
หากต้องการหลีกเลี่ยงบรรทัดว่างและบรรทัดที่ไม่มีอะไรนอกจากช่องว่างนอกเหนือจากบรรทัดที่เหมือนกันซึ่งมีความแตกต่างเดียวของช่องว่างนำหน้า ...
diff -b \
<(grep -vE '^([ \t]*#|^[ \t]*$)' f1)\
<(grep -vE '^([ \t]*#|^[ \t]*$)' f2)
ถึงตอนนี้ฉันอาจใส่มันลงในสคริปต์และเขียนบางอย่างเช่นคำแนะนำดั้งเดิมที่อ่านได้มากกว่านี้เล็กน้อย
หากคุณค่อนข้างพอใจกับเสียงเรียกเข้าฉันขอแนะนำให้คุณใช้vimdiff :
vimdiff file1 file2
สิ่งนี้จะเปิดเป็นกลุ่มเซสชันด้วยบานหน้าต่างสองบานโดยมีหนึ่งไฟล์ในแต่ละด้าน ไฮไลท์และสีจะบ่งบอกถึงความแตกต่างระหว่างไฟล์และส่วนที่เหมือนกันทั้งหมดจะถูกซ่อน (พับเก็บได้ แต่ขยายได้)
จากนั้นหากคุณต้องการผสานความแตกต่างจากไฟล์หนึ่งไปยังอีกไฟล์หนึ่งคุณสามารถใช้คำสั่งต่อไปนี้:
(พิจารณาไฟล์ "ปัจจุบัน" เป็นไฟล์ที่เคอร์เซอร์อยู่)
^ W ^ W เพื่อเปลี่ยนโฟกัสจากหน้าต่างของไฟล์หนึ่งเป็นหน้าต่างของไฟล์อื่น
] c เพื่อไปยังบล็อกถัดไปที่มีความแตกต่าง
[c เพื่อย้อนกลับค้นหาบล็อกก่อนหน้านี้ที่มีความแตกต่าง
ทำ ( d iff o btain) เพื่อนำการเปลี่ยนแปลงจากไฟล์อื่นไปยังไฟล์ปัจจุบัน
dp ( d iff p ut) เพื่อส่งการเปลี่ยนแปลงจากไฟล์ปัจจุบันไปยังไฟล์อื่น
หมายเหตุ: ทั้งdoและdpทำงานหากคุณอยู่บนบล็อกหรือเพียงหนึ่งบรรทัดภายใต้บล็อก
มึง ไปยู Ndo
zo เพื่อเปิด / ปิดการซ่อนข้อความ
zcเพื่อพับ / ซ่อนข้อความอีกครั้ง
zrจะเปิดไฟล์ทั้งสองอย่างสมบูรณ์ (การใช้: ช่วยในการพับเพิ่มเติมเกี่ยวกับการพับ)
: diffupdateจะทำการสแกนไฟล์ซ้ำเพื่อหาการเปลี่ยนแปลง
เมื่อคุณเริ่มย้ายข้อความที่ถูกเปลี่ยนแปลงไปหรือนำการเปลี่ยนแปลงส่วนต่าง ๆ ที่เหมือนกันในตอนนี้ของไฟล์จะย่อส่วนโดยอัตโนมัติเช่นกัน
เมื่อเสร็จแล้วคุณสามารถออกจากและเขียนไฟล์ทั้งสองด้วย: xa!
นอกจากนี้คุณยังสามารถเขียนออกจากทิ้งการเปลี่ยนแปลง ฯลฯ หนึ่งบานหน้าต่างในเวลาเดียวกับที่คุณมักจะทำกับกลุ่ม
คุณสามารถใช้คำสั่ง vim ทั่วไปเพื่อแก้ไขไฟล์ได้ตามต้องการ ฉันได้อธิบายเฉพาะคำสั่งที่ใช้บ่อยและมีประโยชน์ที่คุณน่าจะใช้ในเซสชัน vimdiff (ซึ่งตรงกันข้ามกับคำสั่งทั่วไปที่เป็นกลุ่ม)
Beyond Compare เป็นเครื่องมือที่สุดยอดสำหรับสิ่งนี้!
Link: http://www.scootersoftware.com/
พร้อมใช้งานสำหรับ Windows และ Linux
Jeff เขียนบทความภาพรวมที่ดีเกี่ยวกับเครื่องมือชั่วครู่กลับ:
http://www.codinghorror.com/blog/archives/000454.html
เมื่อขยายเป็นหนึ่งซับของ nima คุณสามารถทำเช่นนั้นเป็นฟังก์ชันเชลล์แล้ววางลงใน. bashrc ของคุณ
diff <(grep -v '^#' f1) <(grep -v '^#' f2)
กลายเป็น (โดยใช้ -u เพราะฉันชอบ diffs แบบรวม)
function cleandiff {
diff -u <(grep -v '^#' $1| grep -v '^ *$') <(grep -v '^#' $2 | grep -v '^ *$')
}
หากคุณชอบผู้ชม GUI ที่แตกต่างกัน Meld ก็ดีและเข้าใจ dirs / files ที่ควบคุมการแก้ไขแล้ว
หลังจากทำความสะอาดความคิดเห็นแล้วฉันจะแนะนำให้ใช้ KDiff3 เป็นเครื่องมือ diff / merge ที่ดีและคุณไม่จำเป็นต้องใช้ vim fu ในการใช้ :)
อาจมีวิธีที่สง่างามกว่าที่จะทำ แต่ในทางปฏิบัติ (และรวดเร็ว):
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
หากคุณใช้เชลล์เหมือนทุบตีคุณสามารถลองทำสิ่งนี้:
# Name this diff-stripped
STRIPPED=
for i in $*; do
egrep -v "^#|^\s*" "$i" > "$i.stripped"
STRIPPED="$STRIPPED $i.stripped"
done
diff $STRIPPED
จากนั้นเรียกใช้เช่นนี้:
diff-stripped file1 file2 ...
นอกจากนี้คุณยังสามารถเปลี่ยนdiff
ไปvimdiff
หรือซึ่งทั้งสองมาพร้อมกับgvimdiff
vim
การขยายโซลูชันของ Xerxes คุณสามารถใช้เครื่องมือที่ซับซ้อนกว่าdiff
การแสดงความแตกต่าง
wdiff
อาจเป็น "ฉลาดเกินไป" ในบางครั้ง แต่ฉันพบว่ามันมักจะมีประโยชน์สำหรับการมองอย่างรวดเร็วในความแตกต่างระหว่างไฟล์การกำหนดค่า สคริปต์นี้สามารถใช้สำหรับการส่งออกที่มีสี:
#!/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
บน Ubuntu และระบบที่ใช้เดเบียนอื่น ๆapt-get install wdiff
ก่อนที่จะใช้สคริปต์นี้
Meld เป็นตัวเลือก GUI ที่ดี แต่คุณสมบัติ "การกรองข้อความ" มีปัญหาบางอย่าง แทนที่จะใช้การกรองข้อความฉันจะลบความคิดเห็นทั้งหมดก่อนแสดงผลลัพธ์ใน Meld ข้อเสียคือการสูญเสียความสามารถในการแก้ไขไฟล์ขณะที่เปรียบเทียบ นี่เป็นสคริปต์ง่าย ๆ สำหรับการใช้ Meld:
#!/bin/bash
meld <(grep -vE '^([ \t]*#|^[ \t]*$)' $1) \
<(grep -vE '^([ \t]*#|^[ \t]*$)' $2)
บางครั้งบรรทัดทั่วไปเพิ่มเติมหลาย ๆ ไฟล์อาจถูกปล้นโดยการเรียงไฟล์ก่อน diff ดังนั้นฉันจะเพิ่มสิ่งที่เขียนไว้แล้วต่อไปนี้:
diff <(grep -v '^#' f1 | sort) <(grep -v '^#' f2 | sort)
หลักสูตรนี้เหมาะสมสำหรับไฟล์ที่คำสั่งซื้อของบรรทัดไม่ส่งผลกระทบต่อเนื้อหา (โปรดระวัง)
นี่เป็นเหมือนกับซับในของ nima แต่จะกรองบรรทัดว่างตามที่ใครบางคนร้องขอ
diff -u <(egrep -v '^(#| *$)' f1) <(egrep -v '^(#| *$)' f2)
(ฉันจะติดตั้ง colordiff ถ้าเป็นไปได้และใช้สิ่งนั้นแทน diff ทั่วไป)
ฉันใช้ WinMerge http://winmerge.orgเพื่อกระจายไฟล์ฉันต้องดึงไฟล์เหล่านั้นลงในเครื่องของฉัน แต่ใช้งานได้
level
! =)