Existe-t-il un format de résumé côte à côte condensé?

40

J'ai deux fichiers journaux avec des milliers de lignes. Après le pré-traitement, seules quelques lignes diffèrent. Ces lignes restantes sont soit des différences réelles, soit des groupes de lignes mélangés.

Les différences unifiées me permettent de voir les différences détaillées, mais rendent difficile la comparaison manuelle avec des globes oculaires. Les différences côte à côte semblent plus utiles pour la comparaison, mais elles ajoutent également des milliers de lignes inchangées. Y a-t-il un moyen d'obtenir l'avantage des deux mondes?

Notez que ces fichiers journaux sont générés par xscopeun programme qui surveille les données du protocole Xorg. Je recherche des outils généraux pouvant être appliqués à des situations similaires à celles décrites ci-dessus, et non des outils d'analyse de journaux d'accès au serveur Web spécialisés, par exemple.


Deux exemples de fichiers journaux sont disponibles à l' adresse http://lekensteyn.nl/files/qemu-sdl-debug/ ( log13et log14). Une commande de préprocesseur peut être trouvée dans le xscope-filterfichier qui supprime les horodatages et autres détails mineurs.

Lekensteyn
la source
2
Avez-vous diffune --suppress-common-linesoption? pastebin.com/KZrVCNFR
manatwork
1
@manatwork Nice, c'est le cas. Tout moyen d'ajouter plus de contexte (par exemple, les numéros de ligne)?
Lekensteyn
5
Ensuite, peut-être vimdiff(du paquet vim ) répondrait mieux à vos besoins: affichage parallèle, colorisé, lignes communes pliées. Les numéros de ligne peuvent être activés avec :set number.
Manatwork
Je pense que vous devriez mettre vimdiff en réponse :)
Kotte
1
Les outils CLI sont préférés, mais les outils d'interface graphique sont également autorisés s'ils sont suffisamment petits. J'ai essayé kdiff3, mais cela produisait encore beaucoup de détails. Idéalement, je ne vois pas tous les détails inutiles. Je vais joindre deux ensembles de données.
Lekensteyn

Réponses:

37

Les 2 outils diff j'utilise le plus serait fondre et sdiff .

se fondre

Meld est une interface graphique, mais fait un excellent travail en montrant des différences entre les fichiers. Il est davantage destiné au développement logiciel avec des fonctionnalités telles que la possibilité de déplacer les modifications d'un côté à l'autre afin de fusionner les modifications, mais peut être utilisé uniquement comme un outil de différenciation côte à côte.

    ss de fusion

    ss de mise en évidence du code de fusion

sdiff

J'ai utilisé cet outil pendant des années. Je l'exécute généralement avec les commutateurs suivants:

$ sdiff -bBWs file1 file2
  • -b Ignorer les changements dans la quantité d'espace blanc.
  • -W Ignorer tous les espaces blancs.
  • -B Ignorer les modifications dont les lignes sont toutes vides.
  • -s Ne pas sortir les lignes communes.

Souvent, avec les fichiers journaux, vous aurez besoin d'élargir la largeur des colonnes et d'élargir -w <num>l'écran.

d'autres outils que j'utilise de temps en temps

diffc

Diffc est un script python qui colorise la sortie des différences unifiées.

$ diffc [OPTION] FILE1 FILE2

             ss de diffc

Vimdiff

Vimdiff est probablement aussi bon sinon meilleur que le mélange et il peut être exécuté depuis un terminal. J'oublie toujours de l'utiliser, ce qui, pour moi, est un bon indicateur du fait que je trouve l'outil un peu trop difficile à utiliser au quotidien. Mais YMMV.

                                    ss de vimdiff

slm
la source
1
Une fonctionnalité intéressante de Meld, malheureusement non visible sur votre capture d'écran, est la coloration syntaxique des fichiers de code source.
Manatwork
Oui. J'avais l'habitude d'utiliser vimdiff tout le temps. Depuis, je suis passé à l'utilisation de meld. Je trouve qu'il est plus facile à utiliser et il est simplement plus facile de voir ce qu'il dit par rapport à vimdiff.
slm
@manatwork - a ajouté votre lien à la réponse, merci pour les commentaires!
slm
1
Très beau pour le code source, mais pas beaucoup pour comparer les fichiers journaux. J'utilise souvent colordiffde colordiff.org pour le fichier source. À ma connaissance, sdiffest semblable à diff -ysans différence de production mais avec des options légèrement différentes. +1 pour avoir montré quelques bonnes alternatives au plain diff.
Lekensteyn
Je n'ai jamais utilisé colordiff, il faudra que je vérifie. Vous avez raison sur le diff -y. L'ajout de ce commutateur diffsemble avoir eu lieu à un moment donné, ou je ne l'ai jamais remarqué. De plus, voici un lien vers la page de ressources gnu diff tools . Bon matériel pour utiliser cette suite d'outils.
slm
20

J'utilise actuellement des différences côte à côte avec grep filtrant les différentes lignes:

diff -y -W250 log.txt log2.txt | expand | \
    grep -E -C3 '^.{123} [|<>]( |$)' | colordiff | less -rS
  • Option -W250 rend la sortie plus large, ce qui me permet de voir plus de données.
  • expand est nécessaire pour convertir des tabulations en espaces
  • -C3 ajoute 3 lignes de contexte à la sortie de grep.
  • ^.{123} correspond à la moitié des données avant les marqueurs de différences côte à côte.
  • colordiff rend la sortie plus jolie à suivre
  • less -rSpermet aux couleurs ANSI d'être interprétées ( -r) et empêche les lignes enveloppées ( -S).

C'est un hack, les alternatives sont les bienvenues.

Lekensteyn
la source
1
C'est merveilleux
Pat Myron
Bonne idée. Malheureusement, l' grepexpression régulière est trop lente. A également diffune -toption pour développer les onglets.
Timmmm
12

Personne n'a encore mentionné icdiff ? C'est bien! Pic parle pour lui-même: icdiff

Radek Postołowicz
la source
Ceci est un outil très soigné, également disponible sur aur.
Uzumaki D. Ichigo
Trop lent pour les gros fichiers cependant.
Timmmm le
0

La commande "sdiff" de linux affiche les différences côte à côte, y compris par défaut toutes les lignes, mais vous pouvez utiliser différentes options pour afficher uniquement les différences:

sdiff -tWBs -w $COLUMNS config.xml config.xml.original

-t: traduire les onglets en espaces

-W: ignorer les différences d'espaces

-B: ignorer les lignes vides

-s: ignore les lignes identiques

-w $ COLUMNS: utilise toute la largeur de l'écran

Les lignes affichées seront divisées par |, <ou> - voir la documentation, ou simplement l'essayer.

Moshe Yudkowsky
la source