Како упоредити две текстуалне датотеке у Линук терминалу

Potrebna vam je mogućnost da uočite razlike između različitih verzija tekstualne datoteke? U tom slučaju, diff komanda je pravi alat za vas. Ovaj vodič će vas uputiti kako da koristite diff na Linux i macOS sistemima, na jednostavan i razumljiv način.

Detaljnije o diff komandi

Komanda diff služi za poređenje dve datoteke i prikazuje listu razlika između njih. Preciznije, ona generiše spisak izmena koje bi trebalo izvršiti u prvoj datoteci kako bi se ona uskladila sa drugom datotekom. Razumevanje ovoga će vam olakšati interpretaciju izlaza komande diff. Ova komanda je prvobitno osmišljena za pronalaženje razlika u izvornom kodu i generisanje izlaza koji se može koristiti u drugim programima, poput patch komande. U ovom vodiču ćemo istražiti najkorisnije načine upotrebe diff komande.

Počnimo analizom dve datoteke. Redosled datoteka u komandnoj liniji određuje koju će diff smatrati „prvom“ a koju „drugom“ datotekom. U primeru ispod, „alpha1“ je prva, a „alpha2“ druga datoteka. Obe datoteke sadrže fonetsku abecedu, ali je „alpha2“ dodatno uređivana, pa datoteke nisu identične.

Datoteke možemo uporediti koristeći sledeću komandu. Upišite „diff“, zatim razmak, ime prve datoteke, razmak, ime druge datoteke, i pritisnite Enter.

diff alpha1 alpha2

Kako analizirati ovaj izlaz? Kada znate šta da tražite, nije tako komplikovano. Svaka razlika je prikazana redom, u koloni, i svaka razlika ima svoju oznaku. Oznaka se sastoji od brojeva sa obe strane slova, na primer „4c4“. Prvi broj označava broj linije u „alpha1“, a drugi broj broj linije u „alpha2“. Slovo u sredini može biti:

  • c: Linija u prvoj datoteci treba da se izmeni kako bi odgovarala liniji u drugoj datoteci.
  • d: Linija u prvoj datoteci mora biti izbrisana kako bi odgovarala drugoj datoteci.
  • a: Dodatni sadržaj mora biti dodat u prvu datoteku kako bi odgovarao drugoj datoteci.

U našem primeru, „4c4“ nam govori da linija broj četiri u „alpha1“ mora biti promenjena da bi odgovarala liniji broj četiri u „alpha2“. Ovo je prva razlika koju je diff pronašao.

Linije koje počinju sa „<“ odnose se na prvu datoteku, „alpha1“, a linije koje počinju sa „>“ odnose se na drugu datoteku, „alpha2“. Linija „> Dave“ nam pokazuje da je reč „Dave“ sadržaj četvrte linije u „alpha2“. Zaključujemo da moramo zameniti „Delta“ sa „Dave“ u četvrtoj liniji „alpha1“ da bi se ta linija poklapala u obe datoteke.

Sledeća promena je označena sa „12c12“. Po istoj logici, ovo nam govori da red 12 u „alpha1“ sadrži reč „Lima“, ali red 12 u „alpha2“ sadrži reč „Linux“.

Treća promena se odnosi na red koji je izbrisan iz „alpha2“. Oznaka „21d20“ se tumači kao: „red 21 treba obrisati iz prve datoteke kako bi se obe datoteke sinhronizovale od reda 20 nadalje“.

Četvrta razlika je označena kao „26a26,28“. Ova promena se odnosi na tri dodatne linije koje su dodate u „alpha2“. Obratite pažnju na „26,28“ u oznaci. Dva broja odvojena zarezom predstavljaju opseg brojeva linija. U ovom primeru, opseg je od reda 26 do reda 28. Oznaka se tumači kao „u redu 26 u prvoj datoteci, dodajte redove 26 do 28 iz druge datoteke“. Prikazane su nam tri linije iz „alpha2“ koje treba dodati u „alpha1“. One sadrže reči „Quirk“, „Strange“ i „Charm“.

Brzi pregledi u jednom redu

Ako je sve što želite da znate da li su dve datoteke iste, koristite opciju „-s“ (prijavi identične datoteke).

diff -s alpha1 alpha3

Opciju „-q“ (kratko) možete koristiti da biste dobili sažetu informaciju o tome da su datoteke različite.

diff -q alpha1 alpha2

Jedna važna stvar koju treba zapamtiti je da sa dve identične datoteke, opcija „-q“ (kratko) ne prijavljuje ništa.

Alternativni prikaz

Opcija „-y“ (uporedni prikaz) koristi drugačiji format da prikaže razlike u datotekama. Često je korisno koristiti opciju „-W“ (širina) sa uporednim prikazom, kako biste ograničili broj prikazanih kolona. Ovo sprečava pojavu linija koje otežavaju čitanje rezultata. U sledećem primeru, komandi diff smo rekli da prikaže uporedni pogled i da ograniči izlaz na 70 kolona.

diff -y -W 70 alpha1 alpha2

Prva datoteka, „alpha1“, prikazana je sa leve strane, a druga datoteka, „alpha2“, sa desne strane. Linije iz svake datoteke su prikazane jedna pored druge. Pored linija iz „alpha2“ koje su promenjene, izbrisane ili dodate, nalaze se indikatorski znakovi.

|: Linija koja je promenjena u drugoj datoteci.
<: Linija koja je izbrisana iz druge datoteke.
>: Linija koja je dodata u drugu datoteku, a ne postoji u prvoj.

Ako želite kompaktniji uporedni rezime razlika, koristite opciju „–suppress-common-lines“. Ovo prisiljava diff da prikaže samo promenjene, dodate ili izbrisane linije.

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

Dodavanje boje

Drugi program, „colordiff“, dodaje isticanje bojama u izlaz komande diff. Ovo znatno olakšava uočavanje razlika u linijama.

Koristite „apt-get“ da instalirate ovaj paket na vaš sistem ako koristite Ubuntu ili neku drugu distribuciju baziranu na Debianu. Na ostalim Linux distribucijama, koristite alat za upravljanje paketima vaše distribucije.

sudo apt-get install colordiff

Program „colordiff“ se koristi isto kao i „diff“.

U suštini, „colordiff“ je samo omotač za „diff“, a sam diff obavlja sav posao u pozadini. Zato će sve opcije koje rade sa diff-om raditi i sa colordiff-om.

Pružanje konteksta

Kako bismo pronašli sredinu između prikazivanja svih linija u datotekama i prikazivanja samo promenjenih linija, možemo zatražiti od diff-a da prikaže kontekst. Postoje dva načina za to. Oba načina postižu isti cilj, a to je da prikažu određeni broj linija pre i posle svake izmenjene linije. Na taj način možete videti šta se dešava u datoteci na mestu gde je razlika otkrivena.

Prvi metod koristi opciju „-c“ (kopirani kontekst).

colordiff -c alpha1 alpha2

Izlaz diff-a ima zaglavlje. U zaglavlju se nalaze imena dve datoteke i njihovo vreme poslednje izmene. Zvezdice (*) se nalaze ispred imena prve datoteke, a crtice (-) ispred imena druge datoteke. Zvezdice i crtice se koriste da označe kojoj datoteci pripadaju linije u izlazu.

Linija sa zvezdicama i „1,7“ u sredini označava da gledamo linije iz datoteke „alpha1“. Tačnije, gledamo redove od jedan do sedam. Reč „Delta“ je označena kao izmenjena. Pored nje se nalazi znak uzvika (!) i prikazana je crvenom bojom. Prikazane su tri linije nepromenjenog teksta pre i posle tog reda kako bismo mogli da vidimo kontekst te linije u datoteci.

Linija sa crticama i „1,7“ u sredini nam govori da sada gledamo linije iz „alpha2“. Opet, gledamo redove od jedan do sedam, gde je reč „Dave“ u četvrtom redu označena kao drugačija.

colordiff -C 2 alpha1 alpha2

Tri reda konteksta iznad i ispod svake promene su podrazumevana vrednost. Možete odrediti koliko redova konteksta želite da diff prikaže. Da biste to uradili, koristite opciju „-C“ (kopirani kontekst) sa velikim „C“ i navedite broj redova koje želite:

colordiff -u alpha1 alpha2

Druga opcija za prikaz konteksta je opcija „-u“ (ujedinjeni kontekst).

Kao i ranije, u izlazu postoji zaglavlje. Imena dve datoteke i njihovo vreme poslednje izmene su prikazani. Ispred naziva „alpha1“ nalaze se crtice (-), a ispred imena „alpha2“ znakovi plus (+). Ovo nam govori da će se crtice koristiti za upućivanje na „alpha1“, a znaci plus će se koristiti za upućivanje na „alpha2“. Kroz celu listu su razbacane linije koje počinju sa znakom (@). Ove linije označavaju početak svake razlike i govore nam koje se linije prikazuju iz svake datoteke.

Prikazana su tri reda pre i posle linije označene kao različite, kako bismo mogli da vidimo kontekst promenjene linije. U ujedinjenom prikazu, linije sa razlikom su prikazane jedna iznad druge. Liniju iz „alpha1“ prati crtica, a liniju iz „alpha2“ znak plus. Ovaj prikaz postiže u osam redova ono što je kopiranom kontekstualnom prikazu gore trebalo petnaest.

colordiff -U 2 alpha1 alpha2

Kao što se očekuje, možemo tražiti od diff-a da prikaže tačno onoliko redova ujedinjenog konteksta koliko želimo. Da biste to uradili, koristite opciju „-U“ (ujedinjeni kontekst) sa velikim „U“ i navedite željeni broj redova.

Ignorisanje razmaka i velikih slova

colordiff -y -W 70 test4 test5

Pogledajmo još dva fajla, „test4“ i „test5“. Oni sadrže imena šest superheroja.

Rezultati pokazuju da diff ne pronalazi razlike u linijama sa imenima „Black Widow“, „Spider-Man“ i „Thor“. Uočava promene u linijama „Captain America“, „Ironman“ i „Hulk“.

Šta je drugačije? Pa, u „test5“ Hulk se piše malim slovom „h“, a „Captain America“ ima dodatni razmak između „Captain“ i „America“. OK, to je jasno, ali šta nije u redu sa linijom „Ironman“? Nema vidljivih razlika. Evo dobrog pravila. Ako nešto ne vidite, odgovor je – beli prostor. Skoro sigurno postoji razmak ili dva, ili znak tabulacije, na kraju te linije.

Ako vam ove razlike nisu bitne, možete reći diff-u da ignoriše određene vrste razlika u linijama, uključujući:
-i: Ignoriše razlike u velikim i malim slovima.
-Z: Ignoriše prazan prostor na kraju linije.
-b: Ignoriše promene u količini belog prostora.
-w: Ignoriše sve promene belog prostora.

colordiff -i -y -W 70 test4 test5

Zatražimo od diff-a da ponovo proveri te dve datoteke, ali da ovoga puta ignoriše razlike u velikim i malim slovima.

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

Redovi sa „The Hulk“ i „the Hulk“ se sada smatraju identičnim, i nema naznačene razlike zbog malog slova „h“. Zatražimo od diff-a da ignoriše i prazan prostor na kraju linije.

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

Kao što smo i sumnjali, razlika u liniji „Ironman“ je morala biti zbog razmaka na kraju, jer diff više ne označava razliku u toj liniji. To ostavlja „Captain America“. Recimo diff-u da ignoriše i velika i mala slova, i sve razlike u belom prostoru.

Rekavši diff-u da ignoriše razlike koje nas ne zanimaju, diff nam govori da se, za naše potrebe, datoteke podudaraju. Diff komanda ima mnogo više opcija, ali većina njih se odnosi na generisanje izlaza koji je čitljiv za mašine. Njih možete pogledati na Linux man stranici.

Opcije koje smo koristili u ovim primerima će vam pomoći da pronađete razlike između verzija vaših tekstualnih datoteka, pomoću komandne linije i vizuelno.