Hoe twee tekstbestanden in de Linux-terminal te vergelijken

Illustratie van een terminalvenster op Linux
Fatmawati Achmad Zaenuri / Shutterstock.com

Wilt u de verschillen zien tussen twee revisies van een tekstbestand? Dan diff is het commando dat je nodig hebt. Deze tutorial laat zien hoe je diff op Linux en macOS, de gemakkelijke manier.

Duiken in diff

De diff commando vergelijkt twee bestanden en produceert een lijst met de verschillen tussen de twee. Om nauwkeuriger te zijn, produceert het een lijst met de wijzigingen die in het eerste bestand zouden moeten worden aangebracht, zodat het overeenkomt met het tweede bestand. Als u dat in gedachten houdt, zult u het gemakkelijker vinden om de uitvoer van diff. De diff commando is ontworpen om verschillen tussen broncodebestanden te vinden en om een ​​uitvoer te produceren die kan worden gelezen en verwerkt door andere programma’s, zoals het patch-commando. In deze tutorial gaan we kijken naar de meest bruikbare mensvriendelijke manieren om te gebruiken diff.

Laten we er meteen in duiken en twee bestanden analyseren. De volgorde van de bestanden op de opdrachtregel bepaalt welk bestand diff beschouwt als het ‘eerste bestand’ en dat het beschouwt als het ’tweede bestand’. In het onderstaande voorbeeld is alpha1 het eerste bestand en alpha2 is het tweede bestand. Beide bestanden bevatten het fonetische alfabet, maar het tweede bestand, alpha2, heeft wat verdere bewerking ondergaan, zodat de twee bestanden niet identiek zijn.

We kunnen de bestanden met dit commando vergelijken. Type diff, een spatie, de naam van het eerste bestand, een spatie, de naam van het tweede bestand, en druk vervolgens op Enter.

diff alpha1 alpha2

Uitvoer van diff-commando zonder opties

Hoe ontleden we die output? Als je eenmaal weet waar je op moet letten, is het niet zo erg. Elk verschil wordt achtereenvolgens in een enkele kolom weergegeven en elk verschil wordt gelabeld. Het label bevat cijfers aan weerszijden van een letter, zoals 4c4. Het eerste nummer is het regelnummer in alpha1 en het tweede nummer is het regelnummer in alpha2. De letter in het midden kan zijn:

  • c: De regel in het eerste bestand moet worden gewijzigd zodat deze overeenkomt met de regel in het tweede bestand.
  • d: De regel in het eerste bestand moet worden verwijderd om overeen te komen met het tweede bestand.
  • een: Er moet extra inhoud aan het eerste bestand worden toegevoegd om het overeen te laten komen met het tweede bestand.

De 4c4 vertel ons in ons voorbeeld dat regel vier van alpha1 moet worden gewijzigd om overeen te komen met regel vier van alpha2. Dit is het eerste verschil tussen de twee bestanden die diff gevonden.

Lijnen die beginnen met < verwijzen naar het eerste bestand, in ons voorbeeld alpha1, en regels die beginnen met > verwijs naar het tweede bestand, alpha2. De lijn < Delta vertelt ons dat het woord Delta de inhoud is van regel vier in alpha1. De lijn > Dave vertelt ons dat het woord Dave de inhoud is van regel vier in alpha2. Om samen te vatten, moeten we Delta vervangen door Dave op regel vier in alpha1, om die regel in beide bestanden overeen te laten komen.

De volgende wijziging wordt aangegeven met de 12c12. Door dezelfde logica toe te passen, vertelt dit ons dat regel 12 in alpha1 het woord Lima bevat, maar regel 12 van alpha2 het woord Linux.

De derde wijziging verwijst naar een regel die uit alpha2 is verwijderd. Het etiket 21d20 wordt ontcijferd als “regel 21 moet worden verwijderd uit het eerste bestand om beide bestanden vanaf regel 20 te synchroniseren.” De < Uniform line toont ons de inhoud van de regel die uit alpha1 verwijderd moet worden.

Het vierde verschil is gelabeld 26a26,28. Deze wijziging verwijst naar drie extra regels die aan alpha2 zijn toegevoegd. Merk op 26,28 in het label. Getallen met twee regels gescheiden door een komma vertegenwoordigen een reeks regelnummers. In dit voorbeeld is het bereik van regel 26 tot regel 28. Het label wordt geïnterpreteerd als “op regel 26 in het eerste bestand, regel 26 tot 28 uit het tweede bestand toevoegen”. We krijgen de drie regels in alpha2 te zien die moeten worden toegevoegd aan alpha1. Deze bevatten de woorden Quirk, Strange en Charm.

Pittige oneliners

Als u alleen wilt weten of twee bestanden hetzelfde zijn, gebruikt u de -s (rapporteer identieke bestanden) optie.

diff -s alpha1 alpha3

Uitvoer van het diff-commando met de optie -s

U kunt de -q (korte) optie om een ​​even beknopte verklaring te krijgen dat twee bestanden verschillend zijn.

diff -q alpha1 alpha2

Uitvoer van het diff-commando met -q optie

Een ding om op te letten is dat met twee identieke bestanden de-q (korte) optie klapt helemaal dicht en rapporteert helemaal niets.

Een alternatieve kijk

De -y (naast elkaar) optie gebruikt een andere lay-out om de bestandsverschillen te beschrijven. Het is vaak handig om de -W (breedte) optie met het zij-aan-zijaanzicht, om het aantal kolommen dat wordt weergegeven te beperken. Dit vermijdt lelijke omwikkelregels die de uitvoer moeilijk leesbaar maken. Hier hebben we het verteld diff om een ​​display naast elkaar te produceren en de output te beperken tot 70 kolommen.

diff -y -W 70 alpha1 alpha2

Uitvoer van het diff-commando met weergave naast elkaar

Het eerste bestand op de opdrachtregel, alpha1, wordt aan de linkerkant weergegeven en de tweede regel op de opdrachtregel, alpha2, wordt aan de rechterkant weergegeven. De regels van elk bestand worden naast elkaar weergegeven. Er zijn indicatortekens naast die regels in alpha2 die zijn gewijzigd, verwijderd of toegevoegd.

  • |: Een regel die is gewijzigd in het tweede bestand.
  • <: Een regel die is verwijderd uit het tweede bestand.
  • >: Een regel die is toegevoegd aan het tweede bestand dat niet in het eerste bestand staat.

Als u de voorkeur geeft aan een compactere samenvatting van de bestandsverschillen naast elkaar, gebruikt u de --suppress-common-lines optie. Dit dwingt diff om alleen de gewijzigde, toegevoegde of verwijderde regels weer te geven.

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

Uitvoer van het diff-commando met de optie --suppress-common-lines

Voeg een vleugje kleur toe

Een ander hulpprogramma heeft gebeld colordiff voegt kleuraccentuering toe aan de diff output. Dit maakt het veel gemakkelijker om te zien welke lijnen verschillen hebben.

Gebruik apt-get om dit pakket op uw systeem te installeren als u Ubuntu of een andere op Debian gebaseerde distributie gebruikt. Gebruik op andere Linux-distributies de pakketbeheertool van je Linux-distributie.

sudo apt-get install colordiff

Gebruik colordiff net zoals u zou gebruiken diff.

Uitvoer van het colordiff-commando zonder opties

In feite, colordiff is een wrapper voor diff, en diff doet al het werk achter de schermen. Daarom zijn alle diff opties zullen werken met colordiff.

Uitvoer van het colordiff-commando met de optie --suppress-common-lines

Voor wat context

Om een ​​middenweg te vinden tussen het feit dat alle regels in de bestanden op het scherm worden weergegeven en alleen de gewijzigde regels worden vermeld, kunnen we vragen diff om wat context te bieden. Dit kan op twee manieren. Beide manieren bereiken hetzelfde doel, namelijk het tonen van enkele regels voor en na elke gewijzigde regel. U kunt zien wat er aan de hand is in het bestand op de plaats waar het verschil werd gedetecteerd.

De eerste methode gebruikt de -c (gekopieerde context) optie.

colordiff -c alpha1 alpha2

Uitvoer van colordiff met -c optie

De diff output heeft een header. De koptekst bevat de twee bestandsnamen en hun wijzigingstijden. Er zijn asterisken (*) voor de naam van het eerste bestand en streepjes (-) voor de naam van het tweede bestand. Asterisken en streepjes worden gebruikt om aan te geven tot welk bestand de regels in de uitvoer behoren.

Een lijn van sterretjes met 1,7 in het midden geeft aan dat we naar lijnen van alpha1 kijken. Om precies te zijn, we kijken naar regel één tot en met zeven. Het woord Delta wordt gemarkeerd als gewijzigd. Het heeft een uitroepteken ( ! ) ernaast, en het is rood. Er worden drie regels met ongewijzigde tekst voor en na die regel weergegeven, zodat we de context van die regel in het bestand kunnen zien.

De streepjeslijn met 1,7 in het midden vertelt ons dat we nu kijken naar lijnen uit alpha2. Nogmaals, we kijken naar de regels één tot en met zeven, met het woord Dave op regel vier gemarkeerd als anders.

Drie regels context boven en onder elke wijziging is de standaardwaarde. U kunt aangeven hoeveel regels context u wilt diff voorzien. Gebruik hiervoor de -C (gekopieerde context) optie met een hoofdletter “C” en geef het aantal regels op dat u wenst:

colordiff -C 2 alpha1 alpha2

Uitvoer van colordiff met -C 2 optie

De seconde diff optie die context biedt, is de -u (verenigde context) optie.

colordiff -u alpha1 alpha2

Uitvoer van colordiff met -u optie

Net als eerder hebben we een koptekst op de uitvoer. De twee bestanden krijgen een naam en hun wijzigingstijden worden weergegeven. Er zijn streepjes (-) voor de naam van alpha1 en plustekens (+) voor de naam van alpha2. Dit vertelt ons dat streepjes worden gebruikt om naar alpha1 te verwijzen en plustekens om naar alpha2 te verwijzen. Verspreid door de lijst zijn regels die beginnen met bij borden (@). Deze lijnen markeren het begin van elk verschil. Ze vertellen ons ook welke regels uit elk bestand worden weergegeven.

We krijgen de drie regels voor en na de regel te zien die als verschillend is gemarkeerd, zodat we de context van de gewijzigde regel kunnen zien. In de verenigde weergave worden de lijnen met het verschil boven elkaar weergegeven. De regel van alpha1 wordt voorafgegaan door een streepje en de regel van alpha2 wordt voorafgegaan door een plusteken. Deze weergave bereikt in acht regels wat er in de gekopieerde contextweergave hierboven vijftien nodig had.

Zoals je zou verwachten, kunnen we je vragen diff om precies het aantal regels uniforme context te geven dat we zouden willen zien. Gebruik hiervoor de -U (verenigde context) optie met een hoofdletter “U” en geef het aantal regels op dat u wilt:

colordiff -U 2 alpha1 alpha2

Uitvoer van colordiff met -U 2 optie

White Space en Case negeren

Laten we nog twee bestanden analyseren, test4 en test5. Deze hebben de namen zes van superhelden in zich.

colordiff -y -W 70 test4 test5

Uitvoer van colordiff op test4- en test5-bestanden

De resultaten laten dat zien diff vindt niets anders met de lijnen Black Widow, Spider-Man en Thor. Het markeert veranderingen met de lijnen Captain America, Ironman en The Hulk.

Dus wat is er anders? Nou, in test5 wordt Hulk gespeld met een kleine “h”, en Captain America heeft een extra spatie tussen “Captain” en “America.” OK, dat is duidelijk te zien, maar wat is er mis met de Ironman-lijn? Er zijn geen zichtbare verschillen. Hier is een goede vuistregel. Als u het niet kunt zien, is het antwoord witruimte. Er is vrijwel zeker een verdwaalde spatie of twee, of een tab-teken, aan het einde van die regel.

Als ze u niet belangrijk vinden, kunt u instructies geven diff om specifieke soorten lijnverschillen te negeren, waaronder:

  • -ik: Negeer verschillen voor het geval dat.
  • -Z: Negeer achterliggende witruimte.
  • -b: Negeer wijzigingen in de hoeveelheid witruimte.
  • -w: Negeer alle wijzigingen in de witruimte.

Laten we diff vragen om die twee bestanden nogmaals te controleren, maar deze keer om eventuele verschillen te negeren.

colordiff -i -y -W 70 test4 test5

uitvoer van colordiff negeer hoofdletter

De regels met “The Hulk” en “The Hulk” worden nu als een overeenkomst beschouwd, en geen verschil wordt gemarkeerd voor kleine letters “h”. Laten we het vragen diff om ook achterliggende witruimte te negeren.

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

Uitvoer van colordiff negeert achterliggende witruimte

Zoals vermoed, moet achterliggende witruimte het verschil zijn geweest op de Ironman-lijn omdat diff markeert niet langer een verschil voor die regel. Dat verlaat Captain America. Laten we het vragen diff om hoofdlettergebruik te negeren en om te negeren alle witruimteproblemen.

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

Uitvoer van colordiff negeert alle witruimte

Door te vertellen diff om de verschillen te negeren waar we ons geen zorgen over maken, diff vertelt ons dat, voor onze doeleinden, de bestanden overeenkomen.

De diff commando heeft veel meer opties, maar de meeste hebben betrekking op het produceren van machinaal leesbare uitvoer. Deze kunnen worden bekeken op de Linux man-pagina. Met de opties die we in de bovenstaande voorbeelden hebben gebruikt, kunt u alle verschillen tussen versies van uw tekstbestanden opsporen met behulp van de opdrachtregel en menselijke oogbollen.

Nieuwste artikelen

spot_img

Related Stories

Leave A Reply

Vul alstublieft uw commentaar in!
Vul hier uw naam in