Come colorare l'output diff?


18

Volevo formattare i file Unix in modo condizionale, attualmente sto lavorando su diffcomando e volevo sapere se è possibile formattare il testo diffdell'output del comando.

Esempio:

I valori corrispondenti devono essere visualizzati in verde.
I valori senza pari devono essere visualizzati in rosso.

Supponiamo che io abbia due file file1e file2che il mio comando sia diff file1 file2.

Ora volevo supporre che l'output contenga 5 discrepanze, quindi quelle non corrispondenti dovrebbero essere visualizzate in colore rosso. Come raggiungere questo obiettivo utilizzando unix?

In breve "Cambia colore in rosso per l'output del comando diff per valori che non corrispondono"


2
Possibile duplicato di questo
FloHimself

I termini "match" e "mismach" sono un po 'confusi. Ad ogni modo, ora c'è l'opzione --color in diff 3.4 e successive.
Gerry Lufwansa,

Risposte:


24

diff --color è stata aggiunta l'opzione GNU diffutils 3.4 (08-08-2016)

Questa è l' diffimplementazione predefinita sulla maggior parte delle distribuzioni, che presto la riceveranno.

Su 3.5 sembra così:

inserisci qui la descrizione dell'immagine

con:

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

Ho anche richiesto un livello di parola diff come da diff-highlightat: [Diffutils-devel] Aggiungi un flag per produrre un output colorato come git's diff-h | lists.gnu.org

Apparentemente aggiunto in commit c0fa19fe92da71404f809aafb5f51cfd99b1bee2 (mar 2015).


1
Eccellente! Per abilitare questo per impostazione predefinita: alias diff='diff --color=auto'
Tom Hale

1
Ecco la documentazione
Alexey,

19

Se hai accesso a GNU diffpuoi usare le sue --X-group-formatopzioni per ottenere quell'effetto senza ulteriori strumenti:

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

Che utilizza i codici di escape colore ANSI per ottenere rosso e verde, con ANSI-C che cita nella shell per accedere alle \eescape.

--old-group-formate --new-group-formatidentifica le linee non corrispondenti e le inserisce tra i codici di ripristino rosso e colore usando %<e %>, mentre --unchanged-group-formatinserisce le linee di corrispondenza tra i codici verde e di ripristino.

È inoltre possibile utilizzare--old-line-format (ecc), a scapito di fughe colore ridondanti su ogni linea: --old-line-format=$'\e[0;31m%L\e[0m'.


quando eseguo dà diff: 0653-821 opzione illegale - - diff: 0653-821 opzione illegale - o diff: 0653-821 opzione illegale - d diff: 0653-821 opzione illegale - - diff: 0653-821 opzione illegale - g diff: 0653-821 opzione illegale - o errori simili.
Aman,

Hormer quando sto eseguendo i tuoi comandi come da una riga alla volta non sta dando nuova riga senza output -bash-4.2 $ --new-group-format = $ '\ e [0; 31m%> \ e [0m' \ >
Aman,

Posso configurarlo per impostazione predefinita?
Eugen Konkov,

@EugenKonkov È possibile impostare un alias o una funzione nella shell per eseguirlo diff.
Michael Homer,

Questo mi ha dato un po 'di problemi nel tentativo di farlo funzionare. Le cose invariate venivano visualizzate come aggiunte ... rinunciato e installato colordiff
Brian Peterson

9

Provare colordiff file1 file2

Disponibilità di colordiff con la tua distribuzione Linux / BSD

Quelli che eseguono Debian o Ubuntu (o uno qualsiasi dei loro derivati) possono probabilmente semplicemente usare "apt-get install colordiff" per scaricare e installare; colordiff è anche impacchettato per una serie di altre distribuzioni e sistemi operativi Linux, UNIX e BSD.

(Citazione da http://www.colordiff.org/ )


1
Perfetto. Per me, è diff --color=autostato solo colorante gli indicatori di linea e la prima riga di ciascuna +/ -sezione. Piping less -SRper facilitare la navigazione.
Walf,

4

Colorato, word-livello di diff ouput

Ecco cosa puoi fare con lo script seguente e diff-highlight :

Schermata diff colorata

#!/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

( Ringraziamo la risposta di @ retracile per l' sedevidenziazione)


Il link è morto ...
einpoklum il

1

Dovresti dare un'occhiata al hlcomando disponibile su github: git clone http://github.com/mbornet-hl/hl e su: http://www.flashnux.com/notes/page_000022_US.html

hlè un comando Linux scritto in C, appositamente progettato per colorare un file di testo o l'output di un comando. È possibile utilizzare fino a 42 colori contemporaneamente e utilizzare un file di configurazione per semplificare le righe di comando. È possibile colorare l'output di ogni comando che può essere reindirizzato a un altro. E se sai quali sono le espressioni regolari, sarà molto facile da usare. Puoi usare la manpagina per capire come usarla.
hlè molto facile da usare e da configurare. È anche possibile utilizzare lo script hl_generic per colorare l'output dei comandi senza modificarne la sintassi.
Ad esempio, puoi colorare l'output del diffcomando semplicemente digitando il tuo solito comando:

diff file1 file2

Se hai bisogno di aiuto, mandami una e-mail.
Saluti.


1

Esiste uno strumento davvero accurato creato con Python su Github al momento chiamato icdiff. Produce output colorati piacevoli che sono anche consapevoli della "gravità". Lo uso sempre, vale la pena dare un'occhiata.


1

se hai installato vim, puoi farlo diff file1 file2 | vim -

Vim riconoscerà il formato diff e gli darà la colorazione corretta. Il trattino alla fine è lasciare che vim accetti l'input dal comando diff.


'view' (il collegamento di sola lettura a vim) è più adatto a questo scopo.
Anupam Srivastava,

1

Installa Colorizer generico ( grc ) e:

grc diff file1 file2

Disponibile su Linux e MacOS.


0

O puoi usare

1.diff --color=auto file1 file2

2.colordiff file1 file2

3.Il mio preferito: git diff file1 file2implementato come di seguito:

Attualmente uso e raccomando , utilizzando git diff o eseguendo il piping del suo output colordiffutilizzando:

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


Anche a me piace git diff --no-indexma penso che i file debbano essere ricercabili. (Almeno, non funziona con la sostituzione del processo bash per me)
Karl,

@Karl Capisci che ti sei separato, forse c'è un'impostazione Terminale che lo fa (o) in qualche altro modo per renderlo ricercabile. Sto usando git diffda molto tempo e il file è cercabile per me, altrimenti non sarebbe utile che io lo facessi nel modo giusto.
himanshuxd,

2
Forse non ero chiaro molto chiaro. Come esempio (sciocco), questo funziona per me diff --color <(ls | head -n+3) <(ls | tail -n +5)ma non con git diff. Certo, non è un caso comune o troppo difficile da aggirare.
Karl,

0

Solo una nota: per ottenere l'output "side-by-side" è necessario "--color = always". Puoi anche impaginarlo con meno e conservare l'output colorato:

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

E ancora un altro suggerimento: prova a mantenere l'interruttore "--color = always" alla fine. Motivo? Con dmesg di util-linux 2.27.1:

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

0

Questo script utilizza la diff standard pre-versione 3.4 (dovrebbe funzionare con qualsiasi versione di diff) e colora l'output senza modificare il formato di output in alcun modo. Funziona con l'ultima versione di RHEL (versione 7.5) con GNU diff versione 3.3. Mettilo nella tua directory ~ / bin o in qualsiasi altra parte del tuo percorso (suggerisco di chiamarlo "cdiff").

#!/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/"

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.