Hur man jämför två textfiler i Linux-terminalen

Behöver du se skillnaderna mellan två versioner av en textfil? Då är diff kommandot du behöver. Den här handledningen visar hur du använder diff på Linux och macOS, det enkla sättet.

Dykning i diff

Kommandot diff jämför två filer och ger en lista över skillnaderna mellan de två. För att vara mer exakt producerar den en lista över de ändringar som skulle behöva göras i den första filen för att den ska matcha den andra filen. Om du har det i åtanke kommer du att finna det lättare att förstå resultatet från diff. Kommandot diff utformades för att hitta skillnader mellan källkodsfiler och för att producera en utdata som kunde läsas och åtgärdas av andra program, t.ex. lappa kommando. I den här handledningen ska vi titta på de mest användbara människovänliga sätten att använda diff.

Låt oss dyka direkt in och analysera två filer. Ordningen på filerna på kommandoraden avgör vilken fildiff som anses vara den ”första filen” och vilken den anser vara den ”andra filen.” I exemplet nedan är alpha1 den första filen och alpha2 är den andra filen. Båda filerna innehåller fonetiskt alfabet men den andra filen, alpha2, har fått ytterligare redigering så att de två filerna inte är identiska.

Vi kan jämföra filerna med detta kommando. Skriv diff, ett mellanslag, namnet på den första filen, ett mellanslag, namnet på den andra filen och tryck sedan på Retur.

diff alpha1 alpha2

Hur dissekerar vi det resultatet? När du väl vet vad du ska leta efter är det inte så illa. Varje skillnad listas i sin tur i en enda kolumn och varje skillnad är märkt. Etiketten innehåller siffror på vardera sidan av en bokstav, som 4c4. Det första numret är radnumret i alpha1, och det andra numret är radnumret i alpha2. Bokstaven i mitten kan vara:

c: Raden i den första filen måste ändras för att matcha raden i den andra filen.
d: Raden i den första filen måste tas bort för att matcha den andra filen.
a: Extra innehåll måste läggas till i den första filen för att den ska matcha den andra filen.

4c4 i vårt exempel säger oss att rad fyra i alpha1 måste ändras för att matcha rad fyra i alpha2. Detta är den första skillnaden mellan de två filerna som hittade olika.

Rader som börjar med hänvisar till den andra filen, alpha2. Raden Dave berättar att ordet Dave är innehållet i rad fyra i alfa2. För att sammanfatta då måste vi ersätta Delta med Dave på rad fyra i alpha1, för att få den linjen att matcha i båda filerna.

Nästa förändring indikeras av 12c12. Genom att tillämpa samma logik, säger detta oss att rad 12 i alpha1 innehåller ordet Lima, men rad 12 i alpha2 innehåller ordet Linux.

Den tredje ändringen avser en rad som har tagits bort från alpha2. Etiketten 21d20 är dechiffrerad som ”rad 21 måste tas bort från den första filen för att få båda filerna att synkronisera från rad 20 och framåt.” De

Den fjärde skillnaden är märkt 26a26,28. Denna ändring avser tre extra rader som har lagts till i alpha2. Notera 26,28 på etiketten. Tvåradiga nummer separerade med kommatecken representerar en rad radnummer. I det här exemplet är intervallet från rad 26 till rad 28. Etiketten tolkas som ”på rad 26 i den första filen, lägg till raderna 26 till 28 från den andra filen.” Vi visas de tre raderna i alpha2 som måste läggas till alpha1. Dessa innehåller orden Quirk, Strange och Charm.

Snappy One-Liner

Om du allt du vill veta är om två filer är lika, använd alternativet -s (rapportera identiska filer).

diff -s alpha1 alpha3

Du kan använda alternativet -q (kort) för att få ett lika kortfattat uttalande om att två filer är olika.

diff -q alpha1 alpha2

En sak att se upp för är att med två identiska filer slocknar alternativet-q (kort) helt och rapporterar ingenting alls.

En alternativ syn

Alternativet -y (sida vid sida) använder en annan layout för att beskriva filskillnaderna. Det är ofta bekvämt att använda alternativet -W (bredd) med vyn sida vid sida för att begränsa antalet kolumner som visas. Detta undviker fula rader som gör resultatet svår att läsa. Här har vi sagt till diff att producera en sida vid sida-display och att begränsa utmatningen till 70 kolumner.

diff -y -W 70 alpha1 alpha2

Den första filen på kommandoraden, alpha1, visas till vänster och den andra raden på kommandoraden, alpha2, visas till höger. Raderna från varje fil visas sida vid sida. Det finns indikatortecken bredvid de rader i alpha2 som har ändrats, tagits bort eller lagts till.

|: En rad som har ändrats i den andra filen.
<: a="" line="" that="" has="" been="" deleted="" from="" the="" second="" file.="">: En rad som har lagts till i den andra filen som inte finns i den första filen.

Om du föredrar en mer kompakt sammanfattning av filskillnaderna sida vid sida, använd alternativet –suppress-common-lines. Detta tvingar diff att bara lista de ändrade, tillagda eller borttagna raderna.

diff -y -W 70 --suppress-common-lines alpha1 alpha2

Lägg till en skvätt färg

Ett annat verktyg som kallas colordiff lägger till färgmarkering till diff-utmatningen. Detta gör det mycket lättare att se vilka linjer som har skillnader.

Använd apt-get för att installera det här paketet på ditt system om du använder Ubuntu eller en annan Debian-baserad distribution. På andra Linux-distributioner, använd din Linux-distributions pakethanteringsverktyg istället.

sudo apt-get install colordiff

Använd colordiff precis som du skulle använda diff.

Faktum är att colordiff är ett omslag för diff, och diff gör allt arbete bakom kulisserna. På grund av det kommer alla diff-alternativ att fungera med colordiff.

Ge ett visst sammanhang

För att hitta en medelväg mellan att alla rader i filerna visas på skärmen och att bara ha de ändrade raderna listade, kan vi be diff att ge lite sammanhang. Det finns två sätt att göra detta. Båda sätten uppnår samma syfte, vilket är att visa några rader före och efter varje ändrad rad. Du kommer att kunna se vad som händer i filen på den plats där skillnaden upptäcktes.

Den första metoden använder alternativet -c (kopierat sammanhang).

colordiff -c alpha1 alpha2

Diff-utgången har en rubrik. Rubriken listar de två filnamnen och deras ändringstider. Det finns asterisker

före namnet på den första filen och bindestreck (-) före namnet på den andra filen. Asterisker och bindestreck kommer att användas för att indikera vilken fil raderna i utgången tillhör.

En rad med asterisker med 1,7 i mitten indikerar att vi tittar på linjer från alfa1. För att vara exakt tittar vi på rad ett till sju. Ordet Delta flaggas som ändrat. Den har ett utropstecken ( ! ) bredvid sig, och den är röd. Det finns tre rader med oförändrad text som visas före och efter den raden så att vi kan se sammanhanget för den raden i filen.

Linjen med streck med 1,7 i mitten talar om för oss att vi nu tittar på linjer från alpha2. Återigen, vi tittar på rad ett till sju, med ordet Dave på rad fyra flaggat som annorlunda.

colordiff -C 2 alpha1 alpha2

Tre rader med sammanhang ovanför och under varje ändring är standardvärdet. Du kan ange hur många kontextrader du vill att diff ska ge. För att göra detta, använd alternativet -C (kopierat sammanhang) med stort ”C” och ange antalet rader du vill ha:

colordiff -u alpha1 alpha2

Det andra diff-alternativet som erbjuder kontext är alternativet -u (unified context).

Som tidigare har vi en header på utgången. De två filerna namnges och deras modifieringstider visas. Det finns bindestreck (-) före namnet på alfa1 och plustecken (+) före namnet på alfa2. Detta talar om för oss att bindestreck kommer att användas för att referera till alfa1 och plustecken kommer att användas för att referera till alfa2. Utspridda i listan finns linjer som börjar med vid tecken (@). Dessa linjer markerar början på varje skillnad. De berättar också vilka rader som visas från varje fil.

Vi visas de tre linjerna före och efter linjen flaggade som olika så att vi kan se sammanhanget för den ändrade linjen. I den enhetliga vyn visas linjerna med skillnaden ovanför varandra. Raden från alfa1 föregås av ett bindestreck och raden från alfa2 föregås av ett plustecken. Denna visning uppnår på åtta rader vad den kopierade kontextvisningen ovan tog femton att göra.

colordiff -U 2 alpha1 alpha2

Som du förväntar dig kan vi be diff att tillhandahålla exakt det antal rader av enhetligt sammanhang vi vill se. För att göra detta, använd alternativet -U (unified context) med ett stort ”U” och ange antalet rader du vill ha:

Ignorerar vitt utrymme och väska

colordiff -y -W 70 test4 test5

Låt oss analysera ytterligare två filer, test4 och test5. Dessa har namnen sex superhjältar i sig.

Resultaten visar att diff inte finner något annorlunda med linjerna Black Widow, Spider-Man och Thor. Det flaggar upp förändringar med Captain America, Ironman och The Hulk-linjerna.

Så vad är annorlunda? Tja, i test 5 stavas Hulk med gemener ”h” och Captain America har ett extra mellanslag mellan ”Captain” och ”America”. OK, det är klart att se, men vad är det för fel på Ironman-linjen? Det finns inga synliga skillnader. Här är en bra tumregel. Om du inte kan se det är svaret vitt utrymme. Det finns nästan säkert ett eller två avvikande mellanslag, eller ett tabbtecken, i slutet av den raden.

Om de inte spelar någon roll för dig kan du instruera diff att ignorera specifika typer av linjeskillnader, inklusive:
-i: Ignorera skillnader i fallet.
-Z: Ignorera efterföljande blanksteg.
-b: Ignorera ändringar i mängden vitt utrymme.

-w: Ignorera alla blankstegsändringar.

colordiff -i -y -W 70 test4 test5

Låt oss be diff kontrollera de två filerna igen, men den här gången för att ignorera eventuella skillnader.

colordiff -i -Z -y -W 70 test4 test5

Raderna med ”The Hulk” och ”The hulk” anses nu vara en matchning, och ingen skillnad flaggas för gemener ”h”. Låt oss be diff att också ignorera efterföljande blanksteg.

colordiff -i -w -y -W 70 test4 test5

Som misstänkt måste efterföljande blanksteg ha varit skillnaden på Ironman-linjen eftersom diff inte längre flaggar en skillnad för den linjen. Det lämnar Captain America. Låt oss be diff att ignorera skiftläge och att ignorera alla problem med blanksteg.

Genom att säga åt diff att ignorera skillnaderna som vi inte bryr oss om, berättar diff att filerna matchar för våra syften. Kommandot diff har många fler alternativ, men majoriteten av dem hänför sig till att producera maskinläsbar utdata. Dessa kan granskas på Linuxman page

. Alternativen vi har använt i exemplen ovan gör att du kan spåra alla skillnader mellan versioner av dina textfiler, med hjälp av kommandoraden och mänskliga ögonglober.