Wie kann ich die Ausgabe von farbigem Diff auf weniger leiten?

37

Ich habe Git Diff verwendet, das eine farbige Ausgabe erzeugt. Allerdings muss ich jetzt für etwas gewöhnliches Diff verwenden, und es erzeugt eine Menge Ausgabe, die wegen des Mangels an Farben schwer zu lesen ist. Wie kann ich Diff zu einer lesbaren, farbigen Ausgabe bringen? Idealerweise während der Weiterleitung an weniger, um große Dateien einfach überprüfen zu können.

Benubird
quelle

Antworten:

32

diffkönnen keine Farben ausgeben, benötigen Sie ein anderes Programm, wie zum Beispiel colordiffdafür. Farben im Terminal werden über ANSI-Escape-Codes gedruckt, die standardmäßig nicht von less interpretiert werden. Um lessFarben korrekt darzustellen, benötigen Sie den -roder noch besser den -RSchalter:

colordiff -- "$file1" "$file2" | less -R

Von man less:

   -R or --RAW-CONTROL-CHARS
          Like -r, but only ANSI  "color"  escape  sequences  are
          output in "raw" form.  Unlike -r, the screen appearance
          is maintained correctly in most  cases.   ANSI  "color"
          escape sequences are sequences of the form:

               ESC [ ... m

          where  the  "..."  is  zero or more color specification
          characters For the purpose of keeping track  of  screen
          appearance,  ANSI color escape sequences are assumed to
          not move the cursor.  You  can  make  less  think  that
          characters  other  than  "m"  can end ANSI color escape
          sequences by setting the environment  variable  LESSAN‐
          SIENDCHARS  to  the  list of characters which can end a
          color escape sequence.  And you  can  make  less  think
          that characters other than the standard ones may appear
          between the ESC and the m by  setting  the  environment
          variable  LESSANSIMIDCHARS  to  the  list of characters
          which can appear.

Alternativ können Sie festlegen, morewelche Farben standardmäßig korrekt angezeigt werden.


Wenn Sie keine externen Programme installieren können, sollten Sie in der Lage sein, die gleiche Ausgabe auf manuellere Weise zu erhalten:

diff a b | 
   perl -lpe 'if(/^</){$_ = "\e[1;31m$_\e[0m"} 
              elsif(/^>/){$_ = "\e[1;34m$_\e[0m"}'
terdon
quelle
1
Und wenn jemand will der Prozentsatz der Daten sehen angezeigt, müssen sie verwenden less -RM +Gg: superuser.com/questions/64972/...
baptx
13

Die anderen Antworten hier sind möglicherweise veraltet. Ab Coreutils 3.5 diffkann in der Tat eine farbige Ausgabe erzeugt werden, die standardmäßig deaktiviert ist, wenn die Standardausgabe keine Konsole ist.

Von der Manpage:

--color[=WHEN]
färben Sie die Ausgabe ein; WHENsein kann never, alwaysoder auto(Standard)

Um die Farbausgabe zu erzwingen, sollte bei stdout eine Pipe diff --color=always -- "$file1" "$file2" | less -Rfunktionieren.

Kshitiz Sharma
quelle
Sie können auch alias diff='diff --color=always'eine .bashrcoder eine .zshrcDatei hinzufügen.
19.
1
Ja. Ich benutzealias diff='diff --side-by-side --left-column --color=always'
Kshitiz Sharma
Ich benutze alias diff='/usr/bin/diff --color=always 'und alias less='/usr/bin/less -r 'aber, obwohl das Diff anfänglich auf den ersten paar Seiten von weniger gefärbt ist, aber auf langen Diffs wird es manchmal auf Mono zurückgeschaltet. Dies kann bei Sprüngen der Fall sein, die sich eindeutig nicht auf diff auswirken, da die Ausgabe nur einmal generiert wird und nicht springen muss, aber irgendwie weniger den Überblick über die Farben verliert.
NeilG,
8

Um farbiges Diff auf weniger zu leiten:

diff $file1 $file2 | colordiff | less -r

Um die Lesbarkeit zu verbessern, beschränken Sie sich auf einen einzigen Bildschirm:

diff -uw $file1 $file2 | colordiff | less -r

Und um zu verhindern, dass weniger angezeigt wird, wenn nur ein Bildschirm mit Inhalten vorhanden ist:

diff -uw $file1 $file2 | tee /dev/stderr | colordiff | less -r -F

Das -F bewirkt, dass weniger sofort geschlossen wird, wenn weniger als ein Bildschirm angezeigt wird. Die Pipe zu stderr geht verloren, wenn weniger geschlossen wird. Durch das Weiterleiten an stderr wird die Ausgabe erhalten, auch wenn weniger nicht angezeigt wird.

Eine alternative (und meiner Meinung nach bessere) Möglichkeit besteht darin, einfach -X zu verwenden, um zu verhindern, dass der Bildschirm weniger gelöscht wird:

diff -uw $file1 $file2 | colordiff | less -r -X -F

Dies funktioniert gut für mich, könnte aber spezifisch für Bash sein. Colordiff ist kein eingebautes, aber leicht zu installieren.

Benubird
quelle
2
Der einzige Befehl, den er braucht, istless -r
sendmoreinfo