Comment puis-je obtenir diff pour montrer uniquement les lignes ajoutées et supprimées? Si diff ne peut pas le faire, quel outil le peut?
diff A B | grep '^[<>]'
comm
.
Comment puis-je obtenir diff pour montrer uniquement les lignes ajoutées et supprimées? Si diff ne peut pas le faire, quel outil le peut?
diff A B | grep '^[<>]'
comm
.
Réponses:
Une autre façon de voir les choses:
Afficher les lignes qui n'existent que dans le fichier a: (c'est-à-dire ce qui a été supprimé de a)
comm -23 a b
Afficher les lignes qui n'existent que dans le fichier b: (c'est-à-dire ce qui a été ajouté à b)
comm -13 a b
Afficher les lignes qui n'existent que dans un fichier ou l'autre: (mais pas les deux)
comm -3 a b | sed 's/^\t//'
(Avertissement: si le fichier a
contient des lignes commençant par TAB, il (le premier TAB) sera supprimé de la sortie.)
REMARQUE: Les deux fichiers doivent être triés pour comm
fonctionner correctement. S'ils ne sont pas déjà triés, vous devez les trier:
sort <a >a.sorted
sort <b >b.sorted
comm -12 a.sorted b.sorted
Si les fichiers sont extrêmement longs, cela peut s'avérer fastidieux, car il nécessite une copie supplémentaire et par conséquent deux fois plus d'espace disque.
comm -12 <(sort a) <(sort b)
comm
pourrait faire ce que vous voulez. De sa page de manuel:
LA DESCRIPTION
Comparez les fichiers triés FILE1 et FILE2 ligne par ligne.
En l'absence d'options, créez une sortie sur trois colonnes. La première colonne contient des lignes uniques à FILE1, la deuxième colonne contient des lignes uniques à FILE2 et la troisième colonne contient des lignes communes aux deux fichiers.
Ces colonnes sont supprimables avec -1
, -2
et -3
respectivement.
Exemple:
[root@dev ~]# cat a
common
shared
unique
[root@dev ~]# cat b
common
individual
shared
[root@dev ~]# comm -3 a b
individual
unique
Et si vous voulez juste les lignes uniques et ne vous souciez pas du fichier dans lequel elles se trouvent:
[root@dev ~]# comm -3 a b | sed 's/^\t//'
individual
unique
Comme le dit la page de manuel, les fichiers doivent être préalablement triés.
Pour afficher les ajouts et les suppressions sans contexte, numéros de ligne, +, -, <,>! etc, vous pouvez utiliser diff comme ceci:
diff --changed-group-format='%<%>' --unchanged-group-format='' a.txt b.txt
Par exemple, à partir de deux fichiers:
a.txt
Common
Common
A-ONLY
Common
b.txt
Common
B-ONLY
Common
Common
La commande suivante affichera les lignes supprimées de a ou ajoutées à b:
diff --changed-group-format='%<%>' --unchanged-group-format='' a.txt b.txt
sortie:
B-ONLY
A-ONLY
Cette commande légèrement différente montrera les lignes supprimées de a.txt:
diff --changed-group-format='%<' --unchanged-group-format='' a.txt b.txt
sortie:
A-ONLY
Enfin, cette commande affichera les lignes ajoutées à a.txt
diff --changed-group-format='%>' --unchanged-group-format='' a.txt b.txt
sortie
B-ONLY
C'est ce que diff fait par défaut ... Peut-être avez-vous besoin d'ajouter des drapeaux pour ignorer les espaces?
diff -b -B
devrait ignorer les lignes vides et un nombre différent d'espaces.
Non, diff
ne montre pas réellement les différences entre deux fichiers dans la façon dont on pourrait penser. Il produit une séquence de commandes d'édition pour un outil, patch
à utiliser pour changer un fichier dans un autre.
La difficulté pour toute tentative de faire ce que vous cherchez est de savoir comment définir ce qui constitue une ligne modifiée par rapport à une ligne supprimée suivie d’une ligne ajoutée. De plus, que faire lorsque des lignes sont ajoutées, supprimées et modifiées les unes à côté des autres.
diff
sources, mais je me souviens de toutes sortes de gyrations pour garder la trace de la concordance de deux fichiers afin de rester synchronisés et je pense qu’il ya un seuil pour abandonner basé sur la distance qui sépare les fichiers. les lignes sont. Mais je ne me souviens d'aucune correspondance intra-ligne, sauf en ce qui concerne l'espace blanc réduit ou le cas ignoré. Ou (peut-être) des mots à cet effet. Dans tous les cas, il s’agit de patch
"vgrep". Peut être. Mardi.
Les outils de comparaison visuelle associent deux fichiers pour qu'un segment comportant le même nombre de lignes mais dont le contenu diffère soit considéré comme un segment modifié. Les nouvelles lignes entre les segments correspondants sont considérées comme des segments ajoutés.
C’est également ainsi que fonctionne l’ outil de ligne de commande sdiff , qui présente une comparaison côte à côte de deux fichiers d’un terminal. Les lignes modifiées sont séparées par | personnage. Si une ligne n'existe que dans le fichier A, <est utilisé comme séparateur. Si une ligne n'existe que dans le fichier B,> est utilisé comme séparateur. Si vous n'avez pas de caractères <et> dans les fichiers, vous pouvez utiliser ceci pour afficher uniquement les lignes ajoutées:
sdiff A B | grep '[<>]'
Merci senarvi, votre solution (non votée pour) m'a en fait EXACTEMENT ce que je voulais après avoir cherché 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 pertinents.
#!/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}'
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
Ainsi, il affiche les anciennes lignes -
suivies immédiatement de la nouvelle ligne correspondante +
.
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é à 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 associée: https://stackoverflow.com/questions/15384818/how-to-get-the-difference-only-additions-between-two-files-in-linux
Testé dans Ubuntu 18.04.
Fichier1:
text670_1
text067_1
text067_2
Fichier2:
text04_1
text04_2
text05_1
text05_2
text067_1
text067_2
text1000_1
Utilisation:
diff -y file1 file2
Cette affiche 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