Hvordan sammenligne to tekstfiler i Linux-terminalen

Trenger du å se forskjellene mellom to versjoner av en tekstfil? Da er diff kommandoen du trenger. Denne opplæringen viser deg hvordan du bruker diff på Linux og macOS, på den enkle måten.

Dykking i diff

Kommandoen diff sammenligner to filer og produserer en liste over forskjellene mellom de to. For å være mer nøyaktig produserer den en liste over endringene som må gjøres i den første filen, for å få den til å samsvare med den andre filen. Hvis du har det i bakhodet, vil du finne det lettere å forstå utgangen fra diff. Diff-kommandoen ble designet for å finne forskjeller mellom kildekodefiler og for å produsere en utdata som kunne leses og reageres på av andre programmer, som f.eks. lapp kommando. I denne opplæringen skal vi se på de mest nyttige menneskevennlige måtene å bruke diff.

La oss dykke rett inn og analysere to filer. Rekkefølgen av filene på kommandolinjen avgjør hvilken filforskjell som anses å være den «første filen» og hvilken den anser som den «andre filen.» I eksemplet nedenfor er alpha1 den første filen, og alpha2 er den andre filen. Begge filene inneholder fonetisk alfabet men den andre filen, alpha2, har fått noe ytterligere redigering slik at de to filene ikke er identiske.

Vi kan sammenligne filene med denne kommandoen. Skriv inn diff, et mellomrom, navnet på den første filen, et mellomrom, navnet på den andre filen, og trykk deretter på Enter.

diff alpha1 alpha2

Hvordan dissekerer vi det resultatet? Når du først vet hva du skal se etter er det ikke så ille. Hver forskjell er oppført etter tur i en enkelt kolonne, og hver forskjell er merket. Etiketten inneholder tall på hver side av en bokstav, som 4c4. Det første tallet er linjenummeret i alpha1, og det andre tallet er linjenummeret i alpha2. Bokstaven i midten kan være:

c: Linjen i den første filen må endres for å matche linjen i den andre filen.
d: Linjen i den første filen må slettes for å matche den andre filen.
a: Ekstra innhold må legges til den første filen for å få den til å matche den andre filen.

4c4 i vårt eksempel forteller oss at linje fire i alpha1 må endres for å matche linje fire i alpha2. Dette er den første forskjellen mellom de to filene som ble funnet.

  Hvordan deaktivere UFW-brannmuren i Linux

Linjer som begynner med refererer til den andre filen, alpha2. Linjen Dave forteller oss at ordet Dave er innholdet i linje fire i alpha2. For å oppsummere så må vi erstatte Delta med Dave på linje fire i alpha1, for å få den linjen til å samsvare i begge filene.

Den neste endringen er indikert med 12c12. Ved å bruke den samme logikken forteller dette oss at linje 12 i alpha1 inneholder ordet Lima, men linje 12 i alpha2 inneholder ordet Linux.

Den tredje endringen refererer til en linje som er slettet fra alpha2. Etiketten 21d20 er dechiffrert som «linje 21 må slettes fra den første filen for å få begge filene til å synkroniseres fra linje 20 og utover.» De

Den fjerde forskjellen er merket 26a26,28. Denne endringen refererer til tre ekstra linjer som er lagt til alpha2. Legg merke til 26,28 på etiketten. To-linjers tall atskilt med komma representerer en rekke linjenumre. I dette eksemplet er området fra linje 26 til linje 28. Etiketten tolkes som «på linje 26 i den første filen, legg til linjene 26 til 28 fra den andre filen.» Vi får vist de tre linjene i alpha2 som må legges til alpha1. Disse inneholder ordene Quirk, Strange og Charm.

Snappy One-Liner

Hvis du alt du vil vite er om to filer er like, bruk alternativet -s (rapporter identiske filer).

diff -s alpha1 alpha3

Du kan bruke alternativet -q (kort) for å få en like kortfattet uttalelse om at to filer er forskjellige.

diff -q alpha1 alpha2

En ting å passe på er at med to identiske filer faller alternativet-q (kort) fullstendig opp og rapporterer ikke noe i det hele tatt.

Et alternativt syn

Alternativet -y (side ved side) bruker en annen layout for å beskrive filforskjellene. Det er ofte praktisk å bruke alternativet -W (bredde) med side ved side-visning for å begrense antall kolonner som vises. Dette unngår stygge omslagslinjer som gjør utskriften vanskelig å lese. Her har vi fortalt diff å produsere en side ved side-skjerm og å begrense utgangen til 70 kolonner.

diff -y -W 70 alpha1 alpha2

Den første filen på kommandolinjen, alpha1, vises til venstre og den andre linjen på kommandolinjen, alpha2, vises til høyre. Linjene fra hver fil vises side ved side. Det er indikatortegn ved siden av linjene i alpha2 som har blitt endret, slettet eller lagt til.

|: En linje som er endret i den andre filen.
<: a="" line="" that="" has="" been="" deleted="" from="" the="" second="" file.="">: En linje som er lagt til den andre filen som ikke er i den første filen.

Hvis du foretrekker en mer kompakt side ved side oppsummering av filforskjellene, bruk alternativet –suppress-common-lines. Dette tvinger diff til kun å vise de endrede, tilføyde eller slettede linjene.

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

Legg til en fargeklatt

Et annet verktøy kalt colordiff legger til fargeutheving til diff-utgangen. Dette gjør det mye lettere å se hvilke linjer som har forskjeller.

  Hvordan installere Oracle VirtualBox på Linux

Bruk apt-get for å installere denne pakken på systemet ditt hvis du bruker Ubuntu eller en annen Debian-basert distribusjon. På andre Linux-distribusjoner, bruk Linux-distribusjonens pakkehåndteringsverktøy i stedet.

sudo apt-get install colordiff

Bruk colordiff akkurat som du ville brukt diff.

Faktisk er colordiff en innpakning for diff, og diff gjør alt arbeidet bak kulissene. På grunn av det vil alle diff-alternativene fungere med colordiff.

Gir litt kontekst

For å finne en mellomting mellom å ha alle linjene i filene vist på skjermen og bare de endrede linjene oppført, kan vi be diff om å gi litt kontekst. Det er to måter å gjøre dette på. Begge måter oppnår samme formål, som er å vise noen linjer før og etter hver endret linje. Du vil kunne se hva som skjer i filen på stedet der forskjellen ble oppdaget.

Den første metoden bruker alternativet -c (kopiert kontekst).

colordiff -c alpha1 alpha2

Diff-utgangen har en header. Overskriften viser de to filnavnene og endringstidene deres. Det er stjerner

før navnet på den første filen og bindestreker (-) før navnet på den andre filen. Stjerner og bindestreker vil bli brukt for å indikere hvilken fil linjene i utdataene tilhører.

En linje med stjerner med 1,7 i midten indikerer at vi ser på linjer fra alpha1. For å være presis, ser vi på linje 1 til 7. Ordet Delta er merket som endret. Den har et utropstegn ( ! ) ved siden av seg, og den er rød. Det er tre linjer med uendret tekst som vises før og etter den linjen, slik at vi kan se konteksten til den linjen i filen.

Linjen med streker med 1,7 i midten forteller oss at vi nå ser på linjer fra alpha2. Igjen, vi ser på linje én til sju, med ordet Dave på linje fire flagget som annerledes.

colordiff -C 2 alpha1 alpha2

Tre linjer med kontekst over og under hver endring er standardverdien. Du kan spesifisere hvor mange linjer med kontekst du vil at diff skal gi. For å gjøre dette, bruk alternativet -C (kopiert kontekst) med stor «C» og oppgi antall linjer du ønsker:

colordiff -u alpha1 alpha2

Det andre diff-alternativet som tilbyr kontekst er alternativet -u (enhetlig kontekst).

Som før har vi en header på utgangen. De to filene er navngitt, og endringstidene deres vises. Det er bindestreker (-) før navnet på alfa1 og plusstegn (+) før navnet på alfa2. Dette forteller oss at bindestreker vil bli brukt for å referere til alfa1 og plusstegn vil bli brukt for å referere til alfa2. Spredt over hele oppføringen er linjer som begynner med ved tegn (@). Disse linjene markerer starten på hver forskjell. De forteller oss også hvilke linjer som vises fra hver fil.

  Hvordan bruke Shazam på Linux-skrivebordet med SongRec

Vi får vist de tre linjene før og etter linjen flagget som forskjellig slik at vi kan se konteksten til den endrede linjen. I den enhetlige visningen vises linjene med forskjellen over hverandre. Linjen fra alfa1 innledes med en bindestrek og linjen fra alfa2 innledes med et plusstegn. Denne visningen oppnår på åtte linjer det den kopierte kontekstvisningen ovenfor tok femten å gjøre.

colordiff -U 2 alpha1 alpha2

Som du forventer, kan vi be diff om å oppgi nøyaktig antall linjer med enhetlig kontekst vi ønsker å se. For å gjøre dette, bruk alternativet -U (enhetlig kontekst) med stor «U» og oppgi antall linjer du ønsker:

Ignorerer White Space og Case

colordiff -y -W 70 test4 test5

La oss analysere ytterligere to filer, test4 og test5. Disse har navnene seks av superhelter i seg.

Resultatene viser at diff ikke finner noe annerledes med Black Widow, Spider-Man og Thor-linjene. Den markerer endringer med Captain America-, Ironman- og The Hulk-linjene.

Så hva er annerledes? Vel, i test5 staves Hulk med liten «h», og Captain America har et ekstra mellomrom mellom «Captain» og «America.» OK, det er lett å se, men hva er galt med Ironman-linjen? Det er ingen synlige forskjeller. Her er en god tommelfingerregel. Hvis du ikke kan se det, er svaret mellomrom. Det er nesten helt sikkert et mellomrom eller to, eller et tabulatortegn, på slutten av den linjen.

Hvis de ikke betyr noe for deg, kan du instruere diff om å ignorere spesifikke typer linjeforskjeller, inkludert:
-i: Ignorer forskjeller i tilfelle.
-Z: Ignorer etterfølgende mellomrom.
-b: Ignorer endringer i mengden mellomrom.

-w: Ignorer alle mellomromsendringer.

colordiff -i -y -W 70 test4 test5

La oss be diff om å sjekke de to filene på nytt, men denne gangen for å ignorere eventuelle forskjeller i tilfelle.

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

Linjene med «The Hulk» og «The hulk» betraktes nå som et samsvar, og ingen forskjell er flagget for små bokstaver «h». La oss be diff om også å ignorere etterfølgende mellomrom.

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

Som mistenkt må etterfølgende mellomrom ha vært forskjellen på Ironman-linjen fordi diff ikke lenger flagger en forskjell for den linjen. Det forlater Captain America. La oss be diff om å ignorere store og små bokstaver og å ignorere alle problemer med mellomrom.

Ved å fortelle diff å ignorere forskjellene som vi ikke er bekymret for, forteller diff oss at filene samsvarer for vårt formål. Diff-kommandoen har mange flere alternativer, men de fleste av dem er relatert til å produsere maskinlesbare utdata. Disse kan gjennomgås på Linuxmannside

. Alternativene vi har brukt i eksemplene ovenfor vil gjøre deg i stand til å spore opp alle forskjellene mellom versjoner av tekstfilene dine, ved å bruke kommandolinjen og menneskelige øyeepler.