105 votes

Comment faire pour que diff n'affiche que les lignes ajoutées et supprimées ? Si diff ne peut pas le faire, quel outil le peut ?

Comment faire pour que diff n'affiche que les lignes ajoutées et supprimées ? Si diff ne peut pas le faire, quel outil le peut ?

2 votes

Vous devez mieux définir ce que vous entendez par ajout et suppression. Plus précisément, une ligne peut-elle changer ? Si oui, comment voulez-vous qu'une ligne modifiée soit traitée ? Si vous effectuez une vérification strictement axée sur les lignes, une ligne qui change est identique à l'ancienne ligne qui est supprimée et à la nouvelle ligne qui est ajoutée. Par exemple, comment doit-il traiter une ligne qui est divisée en deux ? Comme deux 1 ligne changée ? 2 lignes modifiées ? 1 ligne supprimée et 2 lignes ajoutées ? A moins que vous puissiez garantir que les lignes ne changeront jamais, qu'elles seront juste ajoutées et supprimées, je pense que c'est voué à l'échec sans de meilleures définitions.

2 votes

Je trouve la question assez peu claire. Mais au moins une interprétation de la question pourrait être répondue par diff A B | grep '^[<>]'

0 votes

Vous recherchez peut-être comm .

2voto

Scott Lundberg Points 2354

C'est ce que diff fait par défaut... Peut-être que vous devez ajouter des drapeaux pour ignorer les espaces blancs ?

diff -b -B

doit ignorer les lignes vides et les différents nombres d'espaces.

4 votes

Non, il montre aussi les lignes CHANGÉES (les lignes qui ont un caractère ou quatre différents). Je veux des lignes qui n'existent qu'à gauche ou à droite.

2 votes

On pourrait arguer que les différentes versions d'un fichier CHANGÉ n'existent chacune qu'à gauche ou à droite.

2 votes

Il n'y a aucun moyen pour diff (ou tout autre outil) de dire de manière fiable ce qui est un changement, et ce qui est une ligne supprimée remplacée par une nouvelle ligne.

2voto

geniosity Points 21

Merci senarvi, votre solution (non votée) m'a en fait donné EXACTEMENT ce que je voulais après avoir cherché pendant des siècles sur une tonne de pages.

En utilisant votre réponse, voici ce que j'ai trouvé pour obtenir la liste des choses modifiées/ajoutées/supprimées. L'exemple utilise 2 versions du fichier /etc/passwd et imprime le nom d'utilisateur pour les enregistrements concernés.

#!/bin/bash
sdiff passwd1 passwd2 | grep '[|]' | awk -F: '{print "changed: " $1}'
sdiff passwd1 passwd2 | grep '[<]' | awk -F: '{print "deleted: " $1}'
sdiff passwd1 passwd2 | grep '[>]' | awk -F\> '{print $2}' | awk -F: '{print "added: " $1}'

0 votes

Notez que parce que la différence entre "une ligne a été modifiée" et "une ligne a été supprimée et un autre une ligne a été ajoutée en dessous ou au-dessus" est sémantique. Un outil de comparaison générique basé sur le texte ne peut pas séparer ces cas. Par conséquent, votre réponse basée sur sdiff ne peut pas fonctionner de manière fiable pour tous les cas.

1voto

Rafe Points 4602

Je trouve cette forme particulière souvent utile :

diff --changed-group-format='-%<+%>' --unchanged-group-format='' f g

Exemple :

printf 'a\nb\nc\nd\ne\nf\ng\n' > f
printf 'a\nB\nC\nd\nE\nF\ng\n' > g
diff --old-line-format=$'-%l\n' \
     --new-line-format=$'+%l\n' \
     --unchanged-line-format='' \
     f g

Sortie :

-b
-c
+B
+C
-e
-f
+E
+F

Il montre donc les anciennes lignes avec - suivi immédiatement de la nouvelle ligne correspondante avec + .

Si nous avions une suppression de C :

printf 'a\nb\nd\ne\nf\ng\n' > f
printf 'a\nB\nC\nd\nE\nF\ng\n' > g
diff --old-line-format=$'-%l\n' \
     --new-line-format=$'+%l\n' \
     --unchanged-line-format='' \
     f g

ça ressemble à ça :

-b
+B
+C
-e
-f
+E
+F

Le format est documenté à l'adresse suivante man diff :

       --line-format=LFMT
              format all input lines with LFMT`

et :

       LTYPE is 'old', 'new', or 'unchanged'.
              GTYPE is LTYPE or 'changed'.

et :

              LFMT (only) may contain:

       %L     contents of line

       %l     contents of line, excluding any trailing newline

       [...]

Question connexe : https://stackoverflow.com/questions/15384818/how-to-get-the-difference-only-additions-between-two-files-in-linux

Testé dans Ubuntu 18.04.

-1voto

Adriano Points 97

Fichier 1 :

text670_1
text067_1
text067_2

Fichier 2 :

text04_1
text04_2
text05_1
text05_2
text067_1
text067_2
text1000_1

Utilisez :

diff -y file1 file2

Cela montre deux colonnes pour les fichiers repectives.

Sortie :

text670_1                           
                                  > text04_1
                                  > text04_2
                                  > text05_1
                                  > text05_2
text067_1                           text67_1
text067_2                           text67_2
                                  > text1000_1

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X