Comment colorier la sortie diff?

18

Je voulais formater les fichiers Unix de manière conditionnelle, je travaille actuellement sur la diffcommande et je voulais savoir s'il était possible de formater le texte de la diffsortie de la commande.

Exemple:

Les valeurs correspondantes doivent être affichées en vert.
Les valeurs inégalées doivent être affichées en rouge.

Supposons que j'ai deux fichiers file1et file2que ma commande soit diff file1 file2.

Maintenant, je voulais que supposer que la sortie contienne 5 non-concordance, alors cette discordance devrait être affichée en couleur rouge. Comment y parvenir avec unix?

En bref "Changer la couleur en rouge pour la sortie de la commande diff pour les valeurs qui ne correspondent pas"

Un homme
la source
2
Copie
Les termes "match" et "mismach" sont un peu déroutants. Quoi qu'il en soit, il y a maintenant l'option --color dans le diff 3.4 et versions ultérieures.
Gerry Lufwansa

Réponses:

24

diff --color option a été ajoutée GNU diffutils 3.4 (2016-08-08)

Il s'agit de l' diffimplémentation par défaut de la plupart des distributions, qui sera bientôt disponible.

Sur 3.5, cela ressemble à ceci:

entrez la description de l'image ici

avec:

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

J'ai également demandé la différence de niveau de mot à partir diff-highlightde: [Diffutils-devel] Ajoutez un drapeau pour produire une sortie colorée comme diff-h de git | lists.gnu.org

Apparemment ajouté dans la validation c0fa19fe92da71404f809aafb5f51cfd99b1bee2 (mars 2015).

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
la source
1
Excellent! Pour l'activer par défaut: alias diff='diff --color=auto'
Tom Hale
1
Voici la documentation.
Alexey
19

Si vous avez accès à GNU, diffvous pouvez utiliser ses --X-group-formatoptions pour obtenir cet effet sans aucun outil supplémentaire:

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

Cela utilise des codes d'échappement de couleur ANSI pour obtenir le rouge et le vert, avec ANSI-C entre guillemets pour accéder aux \eéchappements.

--old-group-formatet --new-group-formatidentifier les lignes qui ne correspondent pas et les insérer entre les codes de réinitialisation rouge et couleur à l'aide de %<et %>, tout en --unchanged-group-formatinsérant des lignes correspondantes entre les codes vert et de réinitialisation.

Vous pouvez également utiliser--old-line-format (etc.), au détriment des évasions de couleur redondantes sur chaque ligne: --old-line-format=$'\e[0;31m%L\e[0m'.

Michael Homer
la source
quand je l'exécute, il donne diff: 0653-821 option illégale - - diff: 0653-821 option illégale - o diff: 0653-821 option illégale - d diff: 0653-821 option illégale - - diff: 0653-821 option illégale - g diff: 0653-821 option illégale - comme des erreurs.
Aman
Hormer lorsque j'exécute vos commandes car une ligne à la fois ne donne aucune nouvelle ligne à la sortie -bash-4.2 $ --new-group-format = $ '\ e [0; 31m%> \ e [0m' \ >
Aman
Puis-je configurer cela par défaut?
Eugen Konkov
@EugenKonkov Vous pouvez configurer un alias ou une fonction dans votre shell pour exécuter cela diff.
Michael Homer
Cela m'a donné un peu de mal à essayer de le faire fonctionner. Des éléments inchangés apparaissaient comme ajoutés ... ont abandonné et installé colordiff
Brian Peterson
9

Essayer colordiff file1 file2

Disponibilité de colordiff avec votre distribution Linux / BSD

Ceux qui exécutent Debian ou Ubuntu (ou l'un de leurs dérivés) peuvent probablement simplement utiliser "apt-get install colordiff" pour télécharger et installer; colordiff est également fourni avec un certain nombre d'autres distributions et systèmes d'exploitation Linux, UNIX et BSD.

(Citation de http://www.colordiff.org/ )

modesto
la source
1
Parfait. Pour moi, diff --color=auton'a été que des marqueurs de ligne colourising et la première ligne de chaque +/ -section. La tuyauterie less -SRfacilite la navigation.
Walf
4

Couleur, mot-niveau diff ouput

Voici ce que vous pouvez faire avec le script ci-dessous et diff-highlight :

Capture d'écran diff couleur

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

(Crédit à la réponse de @ retracile pour la sedmise en évidence)

Tom Hale
la source
1

Vous devriez jeter un œil à la hlcommande disponible sur github: git clone http://github.com/mbornet-hl/hl et sur: http://www.flashnux.com/notes/page_000022_US.html

hlest une commande Linux écrite en C, spécialement conçue pour colorer un fichier texte ou la sortie d'une commande. Vous pouvez utiliser jusqu'à 42 couleurs simultanément et utiliser un fichier de configuration pour simplifier les lignes de commande. Vous pouvez coloriser la sortie de chaque commande pouvant être redirigée vers une autre. Et si vous savez ce que sont les expressions régulières, il vous sera très facile de les utiliser. Vous pouvez utiliser la manpage pour comprendre comment l'utiliser.
hlest très facile à utiliser et à configurer. Vous pouvez même utiliser le script hl_generic pour coloriser la sortie des commandes sans modifier leur syntaxe.
Vous pouvez, par exemple, coloriser la sortie de la diffcommande simplement en tapant votre commande habituelle:

diff file1 file2

Si vous avez besoin d'aide, envoyez-moi simplement un e-mail.
Cordialement.

mbornet
la source
1

Il existe un outil vraiment soigné construit avec python sur Github au moment appelé icdiff. Produit de belles sorties colorées qui sont également sensibles à la «gravité». Je l'utilise tout le temps, ça vaut le coup.

Joe Healey
la source
1

si vous avez installé vim, vous pouvez le faire diff file1 file2 | vim -

Vim reconnaîtra le format diff et lui donnera une coloration appropriée. Le tiret à la fin est de laisser vim accepter l'entrée de la commande diff.

TrongBang
la source
'view' (le raccourci en lecture seule vers vim) est mieux adapté à cet effet.
Anupam Srivastava
1

Installez Generic Colouriser ( grc ) et:

grc diff file1 file2

Disponible sur Linux et MacOS.

Sohail Si
la source
0

Soit vous pouvez utiliser

1.diff --color=auto file1 file2

2.colordiff file1 file2

3.Mon favori: git diff file1 file2mis en œuvre comme ci-dessous:

J'utilise actuellement et recommande d' utiliser, git diff ou de canaliser sa sortie colordiffen utilisant:

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

himanshuxd
la source
J'aime git diff --no-indexaussi, mais je pense que les fichiers doivent être recherchés. (Au moins, ne fonctionne pas avec la substitution de processus bash pour moi)
Karl
@Karl Figure que vous vous séparez, il y a peut-être un paramètre Terminal qui le fait (ou) d'une autre manière pour le rendre recherché. J'utilise git diffdepuis longtemps et le fichier est recherché pour moi, sinon il ne serait pas utile que je le fasse correctement.
himanshuxd
2
Peut-être que je n'étais pas très clair. À titre d'exemple (idiot), cela fonctionne pour moi diff --color <(ls | head -n+3) <(ls | tail -n +5)mais pas avec git diff. Certes, ce n'est pas un cas courant ou trop difficile à contourner.
Karl
0

Juste une note: pour obtenir la sortie "côte à côte", vous avez besoin de "--color = always". Vous pouvez également le paginer avec moins et conserver la sortie colorée:

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

Et encore une autre astuce: essayez de garder le commutateur "--color = always" à la fin. Raison? Avec dmesg d'util-linux 2.27.1:

dmesg --human --color=always | less -R    # works
dmesg --color=always --human | less -R    # doesn't work
Gus
la source
0

Ce script utilise le diff standard de pré-version 3.4 (il devrait fonctionner avec n'importe quelle version de diff) et colorise la sortie sans changer le format de sortie de quelque façon que ce soit. Il fonctionne avec la dernière version de RHEL (version 7.5) qui a GNU diff version 3.3. Il suffit de le mettre dans votre répertoire ~ / bin ou n'importe où ailleurs dans votre chemin (je suggère de l'appeler "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/"
Beam Davis
la source
0

Différence de couleur au niveau des caractères: installez ccdiff

ccdiff -r /usr/share/dict/words /tmp/new-dict

Sortie de ccdiff

abricot
la source