Sådan sammenlignes to tekstfiler i Linux-terminalen

Har du brug for at se forskellene mellem to revisioner af en tekstfil? Så er diff den kommando, du skal bruge. Denne vejledning viser dig, hvordan du bruger diff på Linux og macOS på den nemme måde.

Dykning i diff

Kommandoen diff sammenligner to filer og producerer en liste over forskellene mellem de to. For at være mere nøjagtig producerer den en liste over de ændringer, der skal foretages i den første fil, for at den matcher den anden fil. Hvis du husker det, vil du finde det lettere at forstå outputtet fra diff. Diff-kommandoen blev designet til at finde forskelle mellem kildekodefiler og til at producere et output, der kunne læses og reageres på af andre programmer, som f.eks. lappe kommando. I denne tutorial skal vi se på de mest nyttige menneskevenlige måder at bruge diff.

Lad os dykke direkte ind og analysere to filer. Rækkefølgen af ​​filerne på kommandolinjen bestemmer, hvilken filforskel, der betragter som den ‘første fil’, og hvilken den anser for at være den “anden fil.” I eksemplet nedenfor er alpha1 den første fil, og alpha2 er den anden fil. Begge filer indeholder fonetisk alfabet men den anden fil, alpha2, har fået yderligere redigering, så de to filer ikke er identiske.

Vi kan sammenligne filerne med denne kommando. Skriv diff, et mellemrum, navnet på den første fil, et mellemrum, navnet på den anden fil, og tryk derefter på Enter.

diff alpha1 alpha2

Hvordan dissekerer vi det output? Når du først ved, hvad du skal kigge efter, er det ikke så slemt. Hver forskel er opført på skift i en enkelt kolonne, og hver forskel er mærket. Etiketten indeholder tal på hver side af et bogstav, f.eks. 4c4. Det første tal er linjenummeret i alpha1, og det andet tal er linjenummeret i alpha2. Bogstavet i midten kan være:

c: Linjen i den første fil skal ændres for at matche linjen i den anden fil.
d: Linjen i den første fil skal slettes for at matche den anden fil.
a: Der skal tilføjes ekstra indhold til den første fil for at få den til at matche den anden fil.

4c4 i vores eksempel fortæller os, at linje fire i alpha1 skal ændres til at matche linje fire i alpha2. Dette er den første forskel mellem de to filer, der er forskellige fundet.

Linjer, der begynder med, henviser til den anden fil, alpha2. Linjen Dave fortæller os, at ordet Dave er indholdet af linje fire i alpha2. For at opsummere så er vi nødt til at erstatte Delta med Dave på linje fire i alpha1, for at få den linje til at matche i begge filer.

  Sådan spiller du Galactic Civilizations III på Linux

Den næste ændring er angivet med 12c12. Ved at anvende den samme logik fortæller dette os, at linje 12 i alpha1 indeholder ordet Lima, men linje 12 i alpha2 indeholder ordet Linux.

Den tredje ændring refererer til en linje, der er blevet slettet fra alpha2. Etiketten 21d20 er dechifreret som “linje 21 skal slettes fra den første fil for at få begge filer til at synkronisere fra linje 20 og fremefter.” Det

Den fjerde forskel er mærket 26a26,28. Denne ændring refererer til tre ekstra linjer, der er blevet tilføjet til alpha2. Bemærk 26,28 på etiketten. To-linjers tal adskilt af et komma repræsenterer en række linjenumre. I dette eksempel er intervallet fra linje 26 til linje 28. Etiketten fortolkes som “på linje 26 i den første fil, tilføj linje 26 til 28 fra den anden fil.” Vi får vist de tre linjer i alpha2, der skal tilføjes til alpha1. Disse indeholder ordene Quirk, Strange og Charm.

Snappy One-Liner

Hvis du kun vil vide, om to filer er ens, skal du bruge -s (rapporter identiske filer).

diff -s alpha1 alpha3

Du kan bruge -q (kort) mulighed for at få en lige så kortfattet erklæring om, at to filer er forskellige.

diff -q alpha1 alpha2

En ting at være opmærksom på er, at med to identiske filer falder indstillingen-q (kort) fuldstændig op og rapporterer ikke noget som helst.

En alternativ udsigt

Indstillingen -y (side om side) bruger et andet layout til at beskrive filforskellene. Det er ofte praktisk at bruge indstillingen -W (bredde) med side om side visning for at begrænse antallet af kolonner, der vises. Derved undgår man grimme omviklingslinjer, der gør output svært at læse. Her har vi bedt diff om at producere et side om side display og at begrænse output til 70 kolonner.

diff -y -W 70 alpha1 alpha2

Den første fil på kommandolinjen, alpha1, vises til venstre, og den anden linje på kommandolinjen, alpha2, vises til højre. Linjerne fra hver fil vises side om side. Der er indikatortegn ved siden af ​​de linjer i alpha2, der er blevet ændret, slettet eller tilføjet.

|: En linje, der er blevet ændret i den anden fil.
<: a="" line="" that="" has="" been="" deleted="" from="" the="" second="" file.="">: En linje, der er blevet tilføjet til den anden fil, der ikke er i den første fil.

Hvis du foretrækker en mere kompakt side om side opsummering af filforskellene, så brug muligheden –suppress-common-lines. Dette tvinger diff til kun at vise de ændrede, tilføjede eller slettede linjer.

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

Tilføj et stænk farve

Et andet værktøj kaldet colordiff tilføjer farvefremhævning til diff-outputtet. Dette gør det meget nemmere at se, hvilke linjer der har forskelle.

  Sådan spiller du 7 days to die på Linux

Brug apt-get til at installere denne pakke på dit system, hvis du bruger Ubuntu eller en anden Debian-baseret distribution. På andre Linux-distributioner skal du bruge din Linux-distributions pakkehåndteringsværktøj i stedet.

sudo apt-get install colordiff

Brug colordiff ligesom du ville bruge diff.

Faktisk er colordiff en indpakning for diff, og diff gør alt arbejdet bag kulisserne. På grund af det vil alle diff-indstillingerne fungere med colordiff.

Giver en vis kontekst

For at finde en mellemvej mellem at have alle linjerne i filerne vist på skærmen og kun at have de ændrede linjer opført, kan vi bede diff om at give noget kontekst. Der er to måder at gøre dette på. Begge måder opnår det samme formål, som er at vise nogle linjer før og efter hver ændret linje. Du vil være i stand til at se, hvad der foregår i filen på det sted, hvor forskellen blev opdaget.

Den første metode bruger muligheden -c (kopieret kontekst).

colordiff -c alpha1 alpha2

Diff-udgangen har en header. Overskriften viser de to filnavne og deres ændringstider. Der er stjerner

før navnet på den første fil og bindestreger (-) før navnet på den anden fil. Stjerner og bindestreger vil blive brugt til at angive, hvilken fil linjerne i outputtet tilhører.

En linje af stjerner med 1,7 i midten indikerer, at vi ser på linjer fra alpha1. For at være præcis, ser vi på linje 1 til 7. Ordet Delta er markeret som ændret. Den har et udråbstegn ( ! ) ved siden af ​​sig, og den er rød. Der er tre linjer med uændret tekst, der vises før og efter den linje, så vi kan se konteksten for den linje i filen.

Linjen med tankestreger med 1,7 i midten fortæller os, at vi nu ser på linjer fra alpha2. Igen ser vi på linje et til syv, hvor ordet Dave på linje fire er markeret som værende anderledes.

colordiff -C 2 alpha1 alpha2

Tre linjer med kontekst over og under hver ændring er standardværdien. Du kan angive, hvor mange linjer af kontekst, du ønsker at diff skal give. For at gøre dette skal du bruge indstillingen -C (kopieret kontekst) med et stort “C” og angive det antal linjer, du ønsker:

colordiff -u alpha1 alpha2

Den anden diff-indstilling, der tilbyder kontekst, er muligheden -u (forenet kontekst).

Som før har vi en header på outputtet. De to filer navngives, og deres ændringstider vises. Der er bindestreger (-) før navnet på alfa1 og plustegn (+) før navnet på alfa2. Dette fortæller os, at bindestreger vil blive brugt til at henvise til alfa1 og plustegn vil blive brugt til at henvise til alfa2. Spredt i listen er linjer, der starter med ved tegn (@). Disse linjer markerer starten på hver forskel. De fortæller os også, hvilke linjer der vises fra hver fil.

  Sådan opretter du krypterede mapper på KDE Linux-skrivebord med hvælvinger

Vi får vist de tre linjer før og efter linjen markeret som værende anderledes, så vi kan se konteksten for den ændrede linje. I den forenede visning er linjerne med forskellen vist over hinanden. Linjen fra alpha1 er indledt med en bindestreg, og linjen fra alpha2 er indledt af et plustegn. Denne visning opnår på otte linjer, hvad den kopierede kontekstvisning ovenfor tog femten at gøre.

colordiff -U 2 alpha1 alpha2

Som du ville forvente, kan vi bede diff om at give nøjagtigt det antal linjer med samlet kontekst, vi gerne vil se. For at gøre dette skal du bruge muligheden -U (forenet kontekst) med et stort “U” og angive det antal linjer, du ønsker:

Ignorerer White Space og Case

colordiff -y -W 70 test4 test5

Lad os analysere yderligere to filer, test4 og test5. Disse har navnene seks af superhelte i sig.

Resultaterne viser, at diff ikke finder noget anderledes med Black Widow, Spider-Man og Thor-linjerne. Det markerer ændringer med Captain America, Ironman og The Hulk-linjerne.

Så hvad er anderledes? Nå, i test5 staves Hulk med et lille “h”, og Captain America har et ekstra mellemrum mellem “Captain” og “America”. OK, det er tydeligt at se, men hvad er der galt med Ironman-linjen? Der er ingen synlige forskelle. Her er en god tommelfingerregel. Hvis du ikke kan se det, er svaret hvidt mellemrum. Der er næsten helt sikkert et mellemrum eller to, eller et tabulatortegn, i slutningen af ​​den linje.

Hvis de ikke betyder noget for dig, kan du instruere diff om at ignorere specifikke typer linjeforskelle, herunder:
-i: Ignorer forskelle i tilfælde.
-Z: Ignorer efterfølgende hvidt mellemrum.
-b: Ignorer ændringer i mængden af ​​hvidt mellemrum.

-w: Ignorer alle hvidrumsændringer.

colordiff -i -y -W 70 test4 test5

Lad os bede diff om at tjekke disse to filer igen, men denne gang for at ignorere eventuelle forskelle.

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

Linjerne med “The Hulk” og “The hulk” betragtes nu som et match, og ingen forskel markeres med små bogstaver “h”. Lad os bede diff om også at ignorere det efterfølgende hvide mellemrum.

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

Som mistænkt må det bagerste mellemrum have været forskellen på Ironman-linjen, fordi diff ikke længere markerer en forskel for den linje. Det efterlader Captain America. Lad os bede diff om at ignorere store og små bogstaver og at ignorere alle problemer med hvidt mellemrum.

Ved at bede diff om at ignorere de forskelle, som vi ikke er bekymrede over, fortæller diff os, at filerne matcher til vores formål. Diff-kommandoen har mange flere muligheder, men størstedelen af ​​dem vedrører produktion af maskinlæsbart output. Disse kan gennemgås på Linuxman-side

. De muligheder, vi har brugt i eksemplerne ovenfor, gør det muligt for dig at spore alle forskellene mellem versioner af dine tekstfiler ved hjælp af kommandolinjen og menneskelige øjenæbler.