Wie färbe ich die Diff-Ausgabe?


16

Ich wollte die Unix-Dateien bedingt formatieren, arbeite gerade an einem diffBefehl und wollte wissen, ob es möglich ist, den Text der diffBefehlsausgabe zu formatieren .

Beispiel:

Übereinstimmende Werte sollten grün angezeigt werden.
Nicht übereinstimmende Werte sollten rot angezeigt werden.

Angenommen, ich habe zwei Dateien file1und file2und mein Befehl lautet diff file1 file2.

Nun wollte ich annehmen, dass die Ausgabe 5 Nichtübereinstimmungen enthält, dann sollten diese Nichtübereinstimmungen in roter Farbe angezeigt werden. Wie erreicht man das mit Unix?

Kurz gesagt: "Ändere die Farbe auf Rot für die Ausgabe des Befehls diff für Werte, die nicht übereinstimmen."


2
Mögliches Duplikat davon
FloHimself 16.04.15

Die Begriffe "Übereinstimmung" und "Nichtübereinstimmung" sind etwas verwirrend. Auf jeden Fall gibt es die Option --color jetzt in Diff 3.4 und höher.
Gerry Lufwansa

Antworten:


21

diff --color Option wurde hinzugefügt GNU diffutils 3.4 (2016-08-08)

Dies ist die Standardimplementierung difffür die meisten Distributionen, die in Kürze verfügbar sein werden.

Auf 3.5 sieht es so aus:

Bildbeschreibung hier eingeben

mit:

diff --color -u \
  <(seq 6 | sed 's/$/ a/') \
  <(seq 8 | grep -Ev '^(2|3)$' | sed 's/$/ a/')

Ich habe auch Wortebene diff angefordert ab diff-highlightbei: [Diffutils-devel] einen Flag In der farbige Ausgabe wie git des diff-h produzieren | lists.gnu.org

Angeblich in commit c0fa19fe92da71404f809aafb5f51cfd99b1bee2 (März 2015) hinzugefügt.


1
Ausgezeichnet! So aktivieren Sie dies standardmäßig: alias diff='diff --color=auto'
Tom Hale

1
Hier ist die Dokumentation.
Alexey

19

Wenn Sie Zugriff auf GNU haben diff, können Sie dessen --X-group-formatOptionen verwenden , um diesen Effekt ohne zusätzliche Tools zu erzielen:

diff --old-group-format=$'\e[0;31m%<\e[0m' \
     --new-group-format=$'\e[0;31m%>\e[0m' \
     --unchanged-group-format=$'\e[0;32m%=\e[0m' \
     file1 file2

Das verwendet ANSI-Farb-Escape-Codes , um Rot und Grün zu erhalten, wobei ANSI-C in der Shell zitiert wird, um auf die Escape -Zeichen zuzugreifen \e.

--old-group-formatund --new-group-formatidentifizieren nicht passenden Linien und legen sie zwischen rot und Farbe Reset - Codes %<und %>, während --unchanged-group-formatEinsätze Linien zwischen Grün und Reset - Codes übereinstimmt.

Sie können auch verwendet--old-line-format werden (usw.), auf Kosten der redundanten Farbe entweicht in jeder Zeile: --old-line-format=$'\e[0;31m%L\e[0m'.


wenn ich es laufen lasse, gibt es diff: 0653-821 illegale Option - - diff: 0653-821 illegale Option - o diff: 0653-821 illegale Option - d diff: 0653-821 illegale Option - - diff: 0653-821 unzulässige Option - g diff: 0653-821 unzulässige Option - o wie Fehler.
Aman,

Wenn ich Ihre Befehle zeilenweise ausführe, wird in der neuen Zeile keine Ausgabe ausgegeben. -Bash-4.2 $ --new-group-format = $ '\ e [0; 31m%> \ e [0m' \ >
Aman

Darf ich das standardmäßig konfigurieren?
Eugen Konkov

@EugenKonkov Sie könnten einen Alias ​​oder eine Funktion in Ihrer Shell einrichten, um das auszuführen diff.
Michael Homer

Das gab mir ein bisschen Mühe, es zum Laufen zu bringen. Unveränderter Inhalt wurde als hinzugefügt angezeigt ... hat Colordiff aufgegeben und installiert
Brian Peterson

9

Versuchen colordiff file1 file2

Verfügbarkeit von colordiff mit Ihrer Linux / BSD-Distribution

Diejenigen, die Debian oder Ubuntu (oder eines ihrer Derivate) ausführen, können wahrscheinlich nur "apt-get install colordiff" zum Herunterladen und Installieren verwenden. colordiff ist auch für eine Reihe anderer Linux-, UNIX- und BSD-Distributionen und Betriebssysteme erhältlich.

(Zitat aus http://www.colordiff.org/ )


1
Perfekt. Für mich diff --color=autowar nur das Kolorieren von Linienmarkierungen und die erste Linie von jeder +/ -Sektion. Das Weiterleiten an less -SRerleichtert das Durchsuchen.
Walf

4

Farbige Ausgabe auf diff Wortebene

Folgendes können Sie mit dem folgenden Skript und Diff-Highlight tun :

Farbiger Diff-Screenshot

#!/bin/sh -eu

# Use diff-highlight to show word-level differences

diff -U3 --minimal "$@" |
  sed 's/^-/\x1b[1;31m-/;s/^+/\x1b[1;32m+/;s/^@/\x1b[1;34m@/;s/$/\x1b[0m/' |
  diff-highlight

( Dank an @retraciles Antwort für die sedHervorhebung)


1

Sie sollten sich den hlBefehl unter github: git clone http://github.com/mbornet-hl/hl und http://www.flashnux.com/notes/page_000022_US.html ansehen

hlist ein in C geschriebener Linux-Befehl, der speziell zum Färben einer Textdatei oder zur Ausgabe eines Befehls entwickelt wurde. Sie können bis zu 42 Farben gleichzeitig verwenden und mithilfe einer Konfigurationsdatei die Befehlszeilen vereinfachen. Sie können die Ausgabe jedes Befehls einfärben, der an einen anderen Befehl weitergeleitet werden kann. Und wenn Sie wissen, was reguläre Ausdrücke sind, können Sie sie ganz einfach verwenden. Sie können die manSeite verwenden, um zu verstehen, wie sie verwendet wird.
hlist sehr einfach zu bedienen und zu konfigurieren. Sie können sogar das Skript hl_generic verwenden, um die Ausgabe von Befehlen einzufärben , ohne ihre Syntax zu ändern .
Sie können beispielsweise die Ausgabe des diffBefehls durch Eingabe Ihres üblichen Befehls einfärben:

diff file1 file2

Wenn Sie Hilfe benötigen, senden Sie mir einfach eine E-Mail.
Grüße.


1

Es gibt im Moment ein wirklich nettes Tool, das mit Python auf Github erstellt wurde icdiff. Erzeugt schöne farbige Ausgaben, die auch den Schweregrad berücksichtigen. Ich benutze es die ganze Zeit, es lohnt sich, es auszuprobieren.


0

Entweder können Sie verwenden

1.diff --color=auto file1 file2

2.colordiff file1 file2

3. Mein Favorit: git diff file1 file2implementiert wie folgt :

Ich verwende und empfehle derzeit Folgendes, um die Ausgabe entweder zu verwenden git diff oder zu leiten colordiff:

diff() { git diff --no-index "$1" "$2" | colordiff; }


Ich mag es git diff --no-indexauch, aber ich denke, Dateien müssen suchbar sein. (Zumindest funktioniert nicht mit Bash-Prozess-Substitution für mich)
Karl

@ Karl Finde heraus, dass du dich selbst trennst. Vielleicht gibt es eine Terminal-Einstellung, die es (oder) auf eine andere Weise macht, um es suchbar zu machen. Ich benutze es git diffseit langer Zeit und die Datei ist für mich suchbar, sonst würde es keinen Sinn haben, wenn ich es richtig mache.
Himanshuxd

2
Vielleicht war ich mir nicht ganz klar. Als (albernes) Beispiel funktioniert das bei mir diff --color <(ls | head -n+3) <(ls | tail -n +5)aber nicht mit git diff. Zugegeben, kein alltäglicher Fall oder zu schwierig, um ihn zu umgehen.
Karl

0

Nur eine Anmerkung: Um die Ausgabe "nebeneinander" zu erhalten, benötigen Sie "--color = always". Sie können auch mit weniger paginieren und die Farbausgabe beibehalten:

diff -y --color=always file1 file2 | less -R

Und noch ein Hinweis: Versuchen Sie, den Schalter "--color = always" am Ende beizubehalten. Grund? Mit dmesg von util-linux 2.27.1:

dmesg --human --color=always | less -R    # works
dmesg --color=always --human | less -R    # doesn't work

0

Dieses Skript verwendet die Standard-Version 3.4 diff (sollte mit jeder Version von diff funktionieren) und färbt die Ausgabe ein, ohne das Ausgabeformat zu ändern. Es funktioniert mit der neuesten Version von RHEL (Version 7.5) mit GNU diff Version 3.3. Legen Sie es einfach in Ihr ~ / bin-Verzeichnis oder an eine andere Stelle in Ihrem Pfad (ich empfehle, es "cdiff" zu nennen).

#!/bin/bash
file1color="$(tput setaf 1)"
file2color="$(tput setaf 2)"
sepcolor="$(tput setaf 6)"
reset="$(tput sgr0)"
diff $* |sed -e "s/^\\(<.*\$\\)/$file1color\\1$reset/;s/^\\(>.*\$\\)/$file2color\\1$reset/;s/^\\(---\$\\)/$sepcolor\\1$reset/"

0

Wenn Sie vim installiert haben, können Sie dies tun diff file1 file2 | vim -

Vim erkennt das Diff-Format und gibt ihm die richtige Farbe. Der Bindestrich am Ende besteht darin, vim Eingaben vom Befehl diff entgegennehmen zu lassen.


'view' (die schreibgeschützte Verknüpfung zu vim) ist für diesen Zweck besser geeignet.
Anupam Srivastava

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.