Jak porównać dwa pliki tekstowe w terminalu Linux

Chcesz zobaczyć różnice między dwiema wersjami pliku tekstowego? W takim razie diff jest poleceniem, którego potrzebujesz. Ten samouczek pokazuje, jak w łatwy sposób korzystać z różnic w systemie Linux i macOS.

Nurkowanie w diff

Polecenie diff porównuje dwa pliki i tworzy listę różnic między nimi. Aby być dokładniejszym, tworzy listę zmian, które należałoby wprowadzić w pierwszym pliku, aby pasował do drugiego pliku. Jeśli weźmiesz to pod uwagę, łatwiej będzie ci zrozumieć wynik działania diff. Polecenie diff zostało zaprojektowane w celu znalezienia różnic między plikami kodu źródłowego i wygenerowania wyniku, który może być odczytywany i używany przez inne programy, takie jak łata Komenda. W tym samouczku przyjrzymy się najbardziej przydatnym, przyjaznym dla człowieka sposobom korzystania z diff.

Zanurkujmy od razu i przeanalizujmy dwa pliki. Kolejność plików w linii poleceń określa, który plik diff uważa za „pierwszy plik”, a który za „drugi plik”. W poniższym przykładzie alpha1 to pierwszy plik, a alpha2 to drugi plik. Oba pliki zawierają rozszerzenie Alfabet fonetyczny ale drugi plik, alpha2, został poddany dalszej edycji, więc oba pliki nie są identyczne.

Możemy porównać pliki za pomocą tego polecenia. Wpisz diff, spację, nazwę pierwszego pliku, spację, nazwę drugiego pliku, a następnie naciśnij klawisz Enter.

diff alpha1 alpha2

Wyjście z polecenia diff bez opcji

Jak przeanalizujemy ten wynik? Kiedy już wiesz, czego szukać, nie jest tak źle. Każda różnica jest wymieniona po kolei w jednej kolumnie, a każda różnica jest oznaczona etykietą. Etykieta zawiera cyfry po obu stronach litery, np. 4c4. Pierwsza liczba to numer linii w alfa1, a druga liczba to numer linii w alfa2. Litera pośrodku może być:

c: Linia w pierwszym pliku musi zostać zmieniona, aby pasowała do linii w drugim pliku.
d: Linia w pierwszym pliku musi zostać usunięta, aby pasowała do drugiego pliku.
a: Dodatkowa zawartość musi zostać dodana do pierwszego pliku, aby pasowała do drugiego pliku.

4c4 w naszym przykładzie mówi nam, że czwarta linia alfa1 musi zostać zmieniona tak, aby odpowiadała czwartej linii alfa2. To jest pierwsza różnica między dwoma znalezionymi plikami.

Wiersze zaczynające się od odnoszą się do drugiego pliku, alpha2. Linia Dave mówi nam, że słowo Dave jest treścią linii czwartej w alfa2. Podsumowując, musimy zamienić Delta na Dave w linii czwartej w alfa1, aby ta linia była zgodna w obu plikach.

Następną zmianę wskazuje 12c12. Stosując tę ​​samą logikę, dowiadujemy się, że wiersz 12 w alfa1 zawiera słowo Lima, ale wiersz 12 alfa2 zawiera słowo Linux.

Trzecia zmiana odnosi się do wiersza, który został usunięty z alfa2. Etykieta 21d20 jest odszyfrowana, ponieważ „wiersz 21 musi zostać usunięty z pierwszego pliku, aby oba pliki były zsynchronizowane od wiersza 20.”. Plik

Czwarta różnica jest oznaczona jako 26a26,28. Ta zmiana dotyczy trzech dodatkowych linii, które zostały dodane do alpha2. Zwróć uwagę na 26,28 na etykiecie. Numery dwuwierszowe oddzielone przecinkiem reprezentują zakres numerów wierszy. W tym przykładzie zakres obejmuje wiersz 26 do wiersza 28. Etykieta jest interpretowana jako „w wierszu 26 w pierwszym pliku dodaj wiersze od 26 do 28 z drugiego pliku”. Pokazane są nam trzy linie z alfa2, które należy dodać do alfa1. Zawierają one słowa Quirk, Strange i Charm.

Snappy One-Liners

Jeśli chcesz tylko wiedzieć, czy dwa pliki są takie same, użyj opcji -s (zgłoś identyczne pliki).

diff -s alpha1 alpha3

Wyjście polecenia diff z opcją -s

Możesz użyć opcji -q (short), aby uzyskać równie zwięzłe stwierdzenie o dwóch różnych plikach.

diff -q alpha1 alpha2

Wyjście polecenia diff z opcją -q

Jedną rzeczą, na którą należy zwrócić uwagę, jest to, że przy dwóch identycznych plikach opcja-q (short) całkowicie się zamyka i nic nie zgłasza.

Alternatywny widok

Opcja -y (obok siebie) używa innego układu do opisu różnic między plikami. Często wygodnie jest użyć opcji -W (szerokość) w widoku obok siebie, aby ograniczyć liczbę wyświetlanych kolumn. Pozwala to uniknąć brzydkich zawijanych wierszy, które utrudniają odczytanie wyniku. Tutaj powiedzieliśmy programowi diff, aby utworzył wyświetlanie obok siebie i ograniczył wynik do 70 kolumn.

diff -y -W 70 alpha1 alpha2

Wyjście polecenia diff z wyświetlaniem obok siebie

Pierwszy plik w linii poleceń, alpha1, jest pokazany po lewej stronie, a druga linia w linii poleceń, alpha2, jest pokazana po prawej. Wiersze z każdego pliku są wyświetlane obok siebie. Obok tych linii w alpha2 znajdują się znaki wskaźnikowe, które zostały zmienione, usunięte lub dodane.

|: Linia, która została zmieniona w drugim pliku.
<: a="" line="" that="" has="" been="" deleted="" from="" the="" second="" file.="">: Linia, która została dodana do drugiego pliku, a nie znajduje się w pierwszym pliku.

Jeśli wolisz bardziej zwięzłe zestawienie różnic między plikami, użyj opcji –suppress-common-lines. Zmusza to diff do wyświetlania tylko zmienionych, dodanych lub usuniętych linii.

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

Wyjście polecenia diff z opcją --suppress-common-lines

Dodaj odrobinę koloru

Inne narzędzie o nazwie colordiff dodaje podświetlanie kolorów do wyjścia diff. Dzięki temu znacznie łatwiej jest zobaczyć, które linie mają różnice.

Użyj apt-get, aby zainstalować ten pakiet w swoim systemie, jeśli używasz Ubuntu lub innej dystrybucji opartej na Debianie. W innych dystrybucjach Linuksa użyj zamiast tego narzędzia do zarządzania pakietami dystrybucji Linuksa.

sudo apt-get install colordiff

Użyj colordiff tak, jak używałbyś diff.

Wyjście polecenia colordiff bez opcji

W rzeczywistości colordiff jest opakowaniem dla diff, a diff wykonuje całą pracę za kulisami. Z tego powodu wszystkie opcje diff będą działać z colordiff.

Dane wyjściowe polecenia colordiff z opcją --suppress-common-lines

Zapewnienie kontekstu

Aby znaleźć jakiś środek między wyświetlaniem wszystkich linii w plikach na ekranie a wyświetlaniem tylko zmienionych wierszy, możemy poprosić diff o podanie kontekstu. Można to zrobić na dwa sposoby. Oba sposoby mają ten sam cel, którym jest wyświetlenie niektórych wierszy przed i po każdej zmienionej linii. Będziesz mógł zobaczyć, co dzieje się w pliku w miejscu, w którym wykryto różnicę.

Pierwsza metoda wykorzystuje opcję -c (kontekst skopiowany).

colordiff -c alpha1 alpha2

Wyjście colordiff z opcją -c

Wyjście diff ma nagłówek. Nagłówek zawiera dwie nazwy plików i ich czasy modyfikacji. Są gwiazdki

przed nazwą pierwszego pliku i myślnikami (-) przed nazwą drugiego pliku. Gwiazdki i myślniki będą używane do wskazania, do którego pliku należą wiersze w danych wyjściowych.

Linia gwiazdek z 1,7 pośrodku oznacza, że ​​patrzymy na linie z alfa1. Dokładniej mówiąc, patrzymy na linie od pierwszego do siódmego. Słowo Delta jest oznaczone jako zmienione. Obok niego znajduje się wykrzyknik (!) I jest czerwony. Istnieją trzy wiersze niezmienionego tekstu wyświetlane przed i po tej linii, dzięki czemu możemy zobaczyć kontekst tej linii w pliku.

Linia myślników z 1,7 w środku mówi nam, że teraz patrzymy na linie z alfa2. Ponownie patrzymy na wiersze od pierwszego do siódmego, ze słowem Dave w wierszu czwartym oznaczonym jako inne.

colordiff -C 2 alpha1 alpha2

Trzy linie kontekstu powyżej i poniżej każdej zmiany to wartość domyślna.  Możesz określić, ile linii kontekstu chcesz dostarczyć.  Aby to zrobić, użyj opcji -C (kontekst skopiowany) z wielką literą „C” i podaj żądaną liczbę wierszy:

Wyjście colordiff z opcją -C 2

colordiff -u alpha1 alpha2

Drugą opcją diff, która oferuje kontekst, jest opcja -u (zunifikowany kontekst).

Wyjście colordiff z opcją -u

Tak jak poprzednio, na wyjściu mamy nagłówek. Te dwa pliki są nazwane i pokazane są ich czasy modyfikacji. Przed nazwą alfa1 znajdują się myślniki (-), a przed nazwą alfa2 znaki plus (+). To mówi nam, że myślniki będą używane w odniesieniu do alpha1, a znaki plus będą używane w odniesieniu do alpha2. Na liście rozrzucone są wiersze zaczynające się od znaku (@). Te linie oznaczają początek każdej różnicy. Mówią nam również, które wiersze są wyświetlane z każdego pliku.

Pokazane są trzy linie przed i za linią oznaczoną jako inna, dzięki czemu możemy zobaczyć kontekst zmienionej linii. W ujednoliconym widoku linie z różnicami są wyświetlane jedna nad drugą. Wiersz od alfa1 poprzedzony jest myślnikiem, a wiersz od alfa2 poprzedzony jest znakiem plus. To wyświetlanie w ośmiu wierszach osiąga to, co pokazanie skopiowanego kontekstu powyżej wymagało piętnastu.

colordiff -U 2 alpha1 alpha2

Jak można się spodziewać, możemy poprosić diff o podanie dokładnej liczby wierszy ujednoliconego kontekstu, które chcielibyśmy zobaczyć.  Aby to zrobić, użyj opcji -U (ujednolicony kontekst) z dużym „U” i podaj żądaną liczbę wierszy:

Wyjście colordiff z opcją -U 2

Ignorowanie białych znaków i wielkości liter

colordiff -y -W 70 test4 test5

Przeanalizujmy kolejne dwa pliki, test4 i test5.  Te mają imiona sześciu superbohaterów.

Wyjście colordiff w plikach test4 i test5

Wyniki pokazują, że diff nie znajduje nic innego w liniach Black Widow, Spider-Man i Thor. Zaznacza zmiany w liniach Captain America, Ironman i The Hulk.

Więc co się zmieniło? Cóż, w teście 5 Hulk jest zapisywany małą literą „h”, a Kapitan Ameryka ma dodatkową spację między „Kapitanem” a „Ameryką”. OK, to widać, ale co jest nie tak z linią Ironman? Nie ma widocznych różnic. Oto dobra zasada. Jeśli go nie widzisz, odpowiedzią jest biały znak. Prawie na pewno na końcu tej linii znajduje się przypadkowa spacja lub dwie lub znak tabulacji.

Jeśli nie mają dla Ciebie znaczenia, możesz poinstruować diff, aby ignorował określone typy różnic między liniami, w tym:
-i: Ignoruj ​​różnice w wielkości liter.
-Z: Ignoruj ​​końcowe białe znaki.
-b: Ignoruj ​​zmiany w ilości białych znaków.

-w: Ignoruj ​​wszystkie zmiany odstępów.

colordiff -i -y -W 70 test4 test5

Poprośmy diff, aby ponownie sprawdził te dwa pliki, ale tym razem zignorował wszelkie różnice w wielkości liter.

wyjście z colordiff ignoruje wielkość liter

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

Linie z „The Hulk” i „The Hulk” są teraz uważane za zgodne i żadna różnica nie jest oznaczana małymi literami „h”.  Poprośmy diff, aby również ignorował końcowe białe znaki.

Dane wyjściowe z colordiff ignorują końcowe białe znaki

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

Jak podejrzewano, końcowe białe spacje musiały być różnicą w linii Ironman, ponieważ diff nie oznacza już różnicy dla tej linii.  To pozostawia Kapitana Amerykę.  Poprośmy diff, aby zignorował wielkość liter i wszystkie problemy z białymi znakami.

Dane wyjściowe z colordiff ignorują wszystkie białe znaki

Mówiąc programowi diff, aby ignorował różnice, którymi nie jesteśmy zainteresowani, diff mówi nam, że dla naszych celów pliki pasują do siebie. Polecenie diff ma o wiele więcej opcji, ale większość z nich jest związana z tworzeniem danych wyjściowych do odczytu maszynowego. Można je przejrzeć w systemie Linuxstrona podręcznika

. Opcje, których użyliśmy w powyższych przykładach, pozwolą ci wyśledzić wszystkie różnice między wersjami twoich plików tekstowych za pomocą wiersza poleceń i ludzkich gałek ocznych.