มีรูปแบบ diff แบบเคียงข้างกันแบบย่อหรือไม่


40

ฉันมีไฟล์บันทึกสองไฟล์ที่มีหลายพันบรรทัด หลังจากประมวลผลล่วงหน้ามีเพียงบางบรรทัดเท่านั้นที่แตกต่างกัน เส้นที่เหลือเหล่านี้อาจเป็นความแตกต่างที่แท้จริงหรือกลุ่มของเส้นที่สับ

ความแตกต่างแบบรวมทำให้ฉันเห็นความแตกต่างโดยละเอียด แต่มันทำให้การเปรียบเทียบแบบแมนนวลกับลูกตานั้นยาก diffs แบบเคียงข้างกันมีประโยชน์มากกว่าสำหรับการเปรียบเทียบ แต่มันยังเพิ่มบรรทัดที่ไม่เปลี่ยนแปลงนับพัน มีวิธีที่จะได้รับประโยชน์จากทั้งสองโลกหรือไม่?

หมายเหตุไฟล์บันทึกเหล่านี้สร้างขึ้นโดยxscopeเป็นโปรแกรมที่ตรวจสอบข้อมูลโปรโตคอล Xorg ฉันกำลังมองหาเครื่องมือที่ใช้งานทั่วไปที่สามารถนำไปใช้กับสถานการณ์ที่คล้ายกับที่กล่าวมาข้างต้นไม่ใช่เครื่องมือวิเคราะห์บันทึกการเข้าถึงเว็บเซิร์ฟเวอร์โดยเฉพาะ


ตัวอย่างล็อกไฟล์สองไฟล์มีอยู่ที่http://lekensteyn.nl/files/qemu-sdl-debug/ ( log13และlog14) คำสั่งตัวประมวลผลล่วงหน้าสามารถพบได้ในxscope-filterไฟล์ที่ลบการประทับเวลาและรายละเอียดเล็กน้อยอื่น ๆ


2
คุณdiffมี--suppress-common-linesตัวเลือกหรือไม่? pastebin.com/KZrVCNFR
จัดการ

1
@ การจัดการที่ดีมันทำ มีวิธีใดที่จะเพิ่มบริบทเพิ่มเติม (เช่นหมายเลขบรรทัด)
Lekensteyn

5
จากนั้นอาจจะvimdiff(จากแพ็คเกจเป็นกลุ่ม ) จะตอบสนองความต้องการของคุณได้ดีกว่า: จอแสดงผลแบบขนาน, colorized, บรรทัดทั่วไปถูกพับ :set numberหมายเลขบรรทัดสามารถเปิดด้วย
จัดการ

ฉันคิดว่าคุณควรใส่ vimdiff ขึ้นเป็นคำตอบ :)
Kotte

1
แนะนำให้ใช้เครื่องมือ CLI แต่เครื่องมือ GUI ก็อนุญาตเช่นกันหากมีขนาดเล็กพอ ฉันลอง kdiff3 แล้ว แต่ก็ยังให้รายละเอียดมาก เป็นการดีที่ฉันไม่เห็นรายละเอียดที่ไม่จำเป็นทั้งหมด ฉันจะแนบชุดข้อมูลสองชุด
Lekensteyn

คำตอบ:


37

2 เครื่องมือ diff ผมใช้ส่วนใหญ่จะผสมและsdiff

ผสม

Meld เป็น GUI แต่ทำงานได้ดีในการแสดงความแตกต่างระหว่างไฟล์ มันเหมาะสำหรับการพัฒนาซอฟต์แวร์ด้วยฟีเจอร์ต่าง ๆ เช่นความสามารถในการย้ายการเปลี่ยนแปลงจากด้านหนึ่งไปอีกด้านหนึ่งเพื่อรวมการเปลี่ยนแปลง แต่สามารถใช้เป็นเครื่องมือการกระจายแบบตรงข้ามกัน

    เอสเอสจาก meld

    ss ของการไฮไลต์รหัส meld

sdiff

ฉันใช้เครื่องมือนี้มาหลายปีแล้ว โดยทั่วไปฉันจะรันด้วยสวิตช์ต่อไปนี้:

$ sdiff -bBWs file1 file2
  • -b ดูรายละเอียดการเปลี่ยนแปลงในพื้นที่สีขาว
  • -W ดูรายละเอียดพื้นที่สีขาวทั้งหมด
  • -B ดูรายละเอียดการเปลี่ยนแปลงที่มีบรรทัดว่างทั้งหมด
  • -s อย่าส่งออกบรรทัดทั่วไป

บ่อยครั้งที่ไฟล์บันทึกที่คุณต้องใช้เพื่อทำให้ความกว้างของคอลัมน์กว้างขึ้นคุณสามารถใช้-w <num>เพื่อทำให้หน้าจอกว้างขึ้น

เครื่องมืออื่น ๆ ที่ฉันใช้เป็นประจำ

diffc

Diffcเป็นสคริปต์ไพ ธ อนซึ่ง colorizes เอาท์พุท diff แบบครบวงจร

$ diffc [OPTION] FILE1 FILE2

             เอสเอสของ diffc

vimdiff

Vimdiffอาจดีถ้าไม่ดีกว่า meld และสามารถเรียกใช้จากเทอร์มินัล ฉันมักจะลืมที่จะใช้มัน แต่สำหรับฉันแล้วมันเป็นตัวบ่งชี้ที่ดีที่ฉันพบเครื่องมือเพียงเล็กน้อยถึงยากที่จะใช้ในแต่ละวัน แต่ YMMV

                                    ss ของ vimdiff


1
หนึ่งในคุณสมบัติที่ยอดเยี่ยมของ Meld แต่น่าเสียดายที่ไม่ปรากฏบนหน้าจอของคุณคือการเน้นไวยากรณ์ของไฟล์ซอร์สโค้ด
จัดการ

ใช่. ฉันเคยใช้ vimdiff ตลอดเวลาตั้งแต่ฉันย้ายไปใช้ meld ฉันพบว่าใช้งานง่ายขึ้นและง่ายขึ้นที่จะเห็นสิ่งที่บอกกับ vimdiff
slm

@ manatwork - เพิ่มลิงค์ของคุณไปยังคำตอบขอบคุณสำหรับความคิดเห็น!
slm

1
ดูดีสำหรับซอร์สโค้ด แต่ไม่มากสำหรับการเปรียบเทียบล็อกไฟล์ ฉันมักจะใช้colordiffจากcolordiff.orgสำหรับไฟล์ต้นฉบับ เพื่อความเข้าใจของฉันsdiffคล้ายdiff -yกับไม่มีความแตกต่างในการส่งออก แต่ตัวเลือกที่แตกต่างกันเล็กน้อย +1 สำหรับแสดงทางเลือกที่ดีในการ diff แบบธรรมดา
Lekensteyn

ฉันไม่เคยใช้ colordiff ฉันจะต้องตรวจสอบมัน diff -yคุณถูกต้องใน การเพิ่มสวิตช์ไปที่diffดูเหมือนว่าจะเกิดขึ้นในบางจุดหรือฉันไม่เคยสังเกต นอกจากนี้ที่นี่เชื่อมโยงไปยัง GNU หน้าทรัพยากรเครื่องมือต่าง สิ่งที่ดีสำหรับการใช้ชุดเครื่องมือนี้
slm

20

ขณะนี้ฉันใช้ diff-by-side diffp และ grep กรองบรรทัดต่าง ๆ :

diff -y -W250 log.txt log2.txt | expand | \
    grep -E -C3 '^.{123} [|<>]( |$)' | colordiff | less -rS
  • ตัวเลือก-W250ทำให้การส่งออกกว้างขึ้นเช่นที่ฉันสามารถดูข้อมูลเพิ่มเติม
  • expand จำเป็นต้องแปลงแท็บเป็นช่องว่าง
  • -C3 เพิ่มบริบท 3 บรรทัดลงในเอาต์พุต grep
  • ^.{123} จับคู่ครึ่งหนึ่งของข้อมูลก่อนเครื่องหมาย diff ข้างกัน
  • colordiff ทำให้เอาต์พุตสวยขึ้นเพื่อติดตาม
  • less -rSอนุญาตให้ตีความ ANSI สี ( -r) และป้องกันไม่ให้มีเส้นที่พัน ( -S)

นี่คือแฮ็คทางเลือกยินดีต้อนรับ


1
มันวิเศษมาก
Pat Myron

ความคิดดี. น่าเสียดายที่grepregex ช้าเกินไป นอกจากนี้ยังdiffมี-tตัวเลือกในการขยายแท็บ
Timmmm

12

ไม่มีใครพูดถึงicdiffหรือยัง มันยอดเยี่ยมมาก! Pic พูดเพื่อตัวเอง: icdiff


นี่เป็นเครื่องมือที่เรียบร้อยมาก ๆ
Uzumaki D. Ichigo

ว่าช้าเกินไปสำหรับไฟล์ขนาดใหญ่
Timmmm

0

คำสั่ง linux "sdiff" แสดงความแตกต่างแบบเคียงข้างกันโดยค่าเริ่มต้นรวมถึงทุกบรรทัด แต่คุณสามารถใช้ตัวเลือกต่าง ๆ เพื่อแสดงความแตกต่างเท่านั้น:

sdiff -tWBs -w $COLUMNS config.xml config.xml.original

ที่ไหน

-t: แปลแท็บเป็นช่องว่าง

-W: ละเว้นความแตกต่างของช่องว่าง

-B: ละเว้นบรรทัดว่าง

-s: ละเว้นบรรทัดที่เหมือนกัน

-w $ COLUMNS: ใช้ความกว้างเต็มหน้าจอ

บรรทัดที่แสดงจะถูกหารด้วย |, <หรือ> - ดูเอกสารประกอบหรือลองใช้ดู

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.