Czy istnieje skondensowany format różnicowy?

40

Mam dwa pliki dziennika z tysiącami linii. Po wstępnym przetworzeniu różnią się tylko niektóre linie. Te pozostałe linie to albo rzeczywiste różnice, albo tasowane grupy linii.

Ujednolicone różnice pozwalają mi zobaczyć szczegółowe różnice, ale utrudnia ręczne porównanie z gałkami ocznymi. Side-by-side diffs wydaje się bardziej przydatny do porównania, ale dodaje także tysiące niezmienionych linii. Czy istnieje sposób na uzyskanie przewagi obu światów?

Uwaga: te pliki dziennika są generowane przez xscopeprogram monitorujący dane protokołu Xorg. Szukam narzędzi ogólnego zastosowania, które można by zastosować w sytuacjach podobnych do powyższego, na przykład nie wyspecjalizowanych narzędzi analizy dzienników dostępu do serwera WWW.


Dwa przykładowe pliki dziennika są dostępne na stronie http://lekensteyn.nl/files/qemu-sdl-debug/ ( log13i log14). W xscope-filterpliku można znaleźć polecenie przetwarzania wstępnego, które usuwa znaczniki czasu i inne drobne szczegóły.

Lekensteyn
źródło
2
Czy diffmasz --suppress-common-linesopcję? pastebin.com/KZrVCNFR
manatwork
1
@manatwork Fajnie, robi. W jakikolwiek sposób dodać więcej kontekstu (np. Numery linii)?
Lekensteyn
5
Wtedy może vimdiff(z pakietu vim ) lepiej spełni twoje potrzeby: wyświetlanie równoległe, pokolorowane, złożone linie wspólne. Numery linii można włączyć za pomocą :set number.
manatwork
Myślę, że powinieneś postawić vimdiff jako odpowiedź :)
Kotte
1
Preferowane są narzędzia CLI, ale narzędzia GUI są również dozwolone, jeśli są wystarczająco małe. Próbowałem KDIFF3, ale nadal był produkowany z dużą ilością szczegółów. Idealnie nie widzę wszystkich niepotrzebnych szczegółów. Dołączę dwa zestawy danych.
Lekensteyn

Odpowiedzi:

37

2 narzędzia różnicowe, których najczęściej używam, to meld i sdiff .

połączenie

Meld to GUI, ale świetnie sobie radzi z pokazywaniem różnic między plikami. Jest bardziej ukierunkowany na tworzenie oprogramowania z funkcjami, takimi jak możliwość przenoszenia zmian z jednej strony na drugą w celu scalenia zmian, ale może być używany jako proste narzędzie różnicowania.

    ss of meld

    ss podświetlenia kodu meld

sdiff

Używam tego narzędzia od lat. Generalnie uruchamiam go za pomocą następujących przełączników:

$ sdiff -bBWs file1 file2
  • -b Zignoruj ​​zmiany w ilości białego pola.
  • -W Zignoruj ​​wszystkie białe znaki.
  • -B Zignoruj ​​zmiany, których wszystkie wiersze są puste.
  • -s Nie wysyłaj wspólnych linii.

Często w przypadku plików dziennika konieczne jest zwiększenie szerokości kolumn, a -w <num>także poszerzenie ekranu.

inne narzędzia, których używam z przerwami

diffc

Diffc jest skryptem w języku Python, który koloryzuje zunifikowane wyjście diff.

$ diffc [OPTION] FILE1 FILE2

             ss diffc

vimdiff

Vimdiff jest prawdopodobnie równie dobry, jeśli nie lepszy niż meld i można go uruchomić z terminala. Zawsze jednak zapominam o jego użyciu, co jest dla mnie dobrym wskaźnikiem, że uważam to narzędzie za trochę trudne do codziennego użytku. Ale YMMV.

                                    ss of vimdiff

slm
źródło
1
Jedną wielką cechą Melda, niestety niewidoczną na twoim zrzucie ekranu, jest podświetlanie składni plików kodu źródłowego.
manatwork
Tak. Przez cały czas używałem vimdiff, od tego czasu zacząłem używać meldu, uważam, że jest łatwiejszy w użyciu i po prostu łatwiej jest zobaczyć, co mi mówi w porównaniu z vimdiff.
slm
@manatwork - dodał link do odpowiedzi, dziękuję za opinie!
slm
1
Wygląda świetnie na kod źródłowy, ale nie tak bardzo na porównywanie plików dziennika. Często używam colordiffz colordiff.org jako pliku źródłowego. W moim rozumieniu sdiffjest podobny do diff -ybez różnic w wydajności, ale z nieco innymi opcjami. +1 za pokazanie dobrych alternatyw dla zwykłego porównania.
Lekensteyn
Nigdy nie korzystałem z colordiff, muszę to sprawdzić. Masz rację w sprawie diff -y. Wydaje się, że dodanie tego przełącznika diffnastąpiło w pewnym momencie lub nigdy tego nie zauważyłem. Dodatkowo znajduje się link do strony zasobów narzędzia GNU Diff . Dobre rzeczy do korzystania z tego zestawu narzędzi.
slm
20

Obecnie używam diff side-by-side z grepem filtrującym różne linie:

diff -y -W250 log.txt log2.txt | expand | \
    grep -E -C3 '^.{123} [|<>]( |$)' | colordiff | less -rS
  • Opcja -W250poszerza wyjście, dzięki czemu mogę zobaczyć więcej danych.
  • expand jest konieczne do konwersji tabulatorów na spacje
  • -C3 dodaje 3 linie kontekstu do wyjścia grep.
  • ^.{123} dopasowuje połowę danych przed bocznymi znacznikami różnicowymi.
  • colordiff sprawia, że ​​wyjście jest ładniejsze
  • less -rSpozwala na interpretację kolorów ANSI ( -r) i zapobiega zawijaniu linii ( -S).

To jest hack, alternatywy są mile widziane.

Lekensteyn
źródło
1
To jest cudowne.
Pat Myron,
Dobry pomysł. Niestety grepregex jest zbyt wolny. Również diffposiada -topcję rozszerzenia karty.
Timmmm
12

Nikt jeszcze nie wspomniał o icdiff ? Wspaniale! Pic mówi sam za siebie: icdiff

Radek Postołowicz
źródło
To bardzo fajne narzędzie, dostępne również na aur.
Uzumaki D. Ichigo
Jednak zbyt wolne dla dużych plików.
Timmmm
0

Polecenie linux „sdiff” pokazuje różnice obok siebie, domyślnie włączając wszystkie linie, ale możesz użyć różnych opcji, aby pokazać tylko różnice:

sdiff -tWBs -w $COLUMNS config.xml config.xml.original

gdzie

-t: przetłumacz tabulatory na spacje

-W: ignoruj ​​różnice białych znaków

-B: ignoruj ​​puste linie

-s: ignoruj ​​linie, które są takie same

-w $ KOLUMNY: użyj pełnej szerokości ekranu

Pokazane linie zostaną podzielone przez |, <lub> - zobacz dokumentację lub po prostu spróbuj.

Mosze Judkowski
źródło