Sauvegarder la sortie d'un grep dans un fichier avec des couleurs

36

Je dois enregistrer le résultat d'une commande grep dans un fichier, mais je souhaite également que le fichier de sortie soit formaté et conserve les couleurs, exactement comme dans le terminal.

Y-a-t-il un moyen de faire ça? Peut-être que grep save dans un langage de balisage? Si ce n'est pas possible, existe-t-il un autre outil capable d'accomplir cette tâche?

J'essaie de faire ressortir le mot clé de recherche dans le fichier de sortie, exactement comme dans le terminal.

Moha le tout-puissant chameau
la source

Réponses:

43

Pour conserver le balisage, il vous faut plus qu'un fichier texte. J'utiliserais une sortie HTML pour conserver les couleurs.

  • Installez aha ie pour "convertir les séquences d'échappement ANSI d'un terminal unix en code HTML "

    sudo apt-get install aha
  • puis enregistrez votre grep(ou ls) sortie comme ceci:

    ls --color=always | aha --black --title 'ls-with-colors' > ls-with-colors.html

    options:

    --black param to set background as black color
    --title param to set the title for HTML page

Surligner la syntaxe pour l’extension de fichier via pygmentize

  • installer pygmentize:

    sudo apt-get install python-pygments
  • puis lancez ce genre de commande:

    pygmentize file.pl | grep -i --color=always version | aha --black > ls-with-colors.html

entrez la description de l'image ici

Sylvain Pineau
la source
1
AHA !! , aha est un outil vraiment merveilleux, exactement ce que je cherchais, merci !!
Moha le tout-puissant chameau
2
@ Mhd.Tahawi: J'ai mis à jour ma réponse afin que vous puissiez conserver les couleurs du code (perl dans votre cas), mais pygmentizefonctionne avec beaucoup d'autres.
Sylvain Pineau
10

Selon ce que vous voulez faire avec le fichier de sortie, il est possible d'ajouter des couleurs à un fichier texte normal car les couleurs proviennent simplement de certains caractères spéciaux. Grep semble ne pas vouloir les imprimer quand vous le redirigez vers un fichier, vous devez donc le forcer à:

grep --color=always "stuff" input.txt > output.txt

Désormais, lorsque vous imprimez le fichier sur la console, il est imprimé avec les couleurs, car Bash interprète ces caractères comme "utilise cette couleur".

cat output.txt

Cependant, si vous l'ouvrez dans un éditeur comme vim, vous obtiendrez des caractères étranges. Par exemple, quand j'utilise les commandes

echo "A sentence. A red sentence. Another sentence." \
  | grep --color=always "A red sentence" > output.txt

Le résultat est correct lorsque je l’imprime avec, catmais lorsque je l’ouvre, vimj’obtiens

A sentence. ^[[01;31m^[[KA red sentence^[[m^[[K. Another sentence.

Donc, si vous voulez utiliser un éditeur, ce n'est probablement pas ce que vous voulez.

MasterOfBinary
la source
Correct !!, j'avais ces symboles étranges entre les deux et je ne comprenais pas ce que c'était.
Moha le tout-puissant chameau
J'aime vraiment à quel point votre réponse est simple / efficace. chat juste la sortie :). c'est parfait pour le court terme (juste assez bien pour moi en ce moment).
Trevor Boyd Smith le
Détail: C'est le terminal (émulateur), et non bash, qui interprète les séquences d'échappement de couleur (caractères étranges).
masterxilo
2

Si j'ai bien compris, vous voulez enregistrer une sortie de terminal dans un fichier texte, n'est-ce pas? Mais vous voulez qu'il soit formaté avec des couleurs. Si tel est le cas, voici mes idées:

Mettre en surbrillance la sortie automatiquement

Comme vous le savez probablement, si vous capturez une sortie grep dans un fichier texte, il est impossible de la formater, car il s’agit d’un fichier texte. Donc, autant que je sache, vous ne pouvez pas le faire facilement.

Malgré cela, il existe une solution de contournement simple, consistant à faire réaliser à votre éditeur de texte le type de fichier en cours d’ouverture. Par exemple, supposons que votre sortie grep comporte des composants bash, donc les soulignements bash fonctionnent pour vous (d'ailleurs, ce sont les couleurs que vous voyez dans une sortie colorée dans le terminal). L'astuce consiste donc à enregistrer la sortie texte dans un fichier avec l'extension appropriée. Au lieu de faire quelque chose comme:

ls | grep something > output

vous pouvez aller chercher

ls | grep something > output.sh

Ce qui fera que gedit (ou tout éditeur de texte correct) reconnaît automatiquement que vous parlez de code bash et le surligne en conséquence. Vous n'avez pas besoin de colorer la sortie, le programme le fera pour vous s'il reconnaît le type de code qu'il ouvre. Si vous travaillez avec d'autres types de formats, adaptez simplement l'extension à cet ajustement en fonction de vos attentes (par exemple> output.xml,> output.html,> output.py ... etc). Bonne chance! :)

Mettre en surbrillance quelques mots dans le fichier de sortie

Donc, si je l'ai, vous voulez mettre en évidence les mots que vous avez recherchés. Encore une fois, cela ne peut pas être fait dans un fichier texte brut simplement parce que c'est un texte brut. Cependant, vous pouvez y ajouter un format très facilement, par exemple en utilisant du codage HTML. Cela transformera votre sortie en un code html, et lorsque vous l'ouvrirez avec un programme capable d'interpréter le html (écrivain libreoffice, firefox et 10000, etc.), vous verrez quelques mots mis en évidence.

Pour ce faire, disons qu'il s'agit de votre grep, exporté au format HTML:

ls | grep keytext > output.html

Et maintenant, vous voulez mettre en évidence le texte clé dans votre sortie. Vous pouvez utiliser sed pour le faire, comme par exemple:

sed -i 's/keytext/<font color="red">keytext<\/font>/g' output.html

Et violà, maintenant ton keytext est surligné en rouge.

Rho
la source
1
bonne idée !!, mais je ne cherche pas la coloration syntaxique. vous savez comment grep colorie le mot clé de recherche avec une autre couleur, généralement le rouge. Je tiens à ce que le mot-clé reste remarquable dans le fichier de sortie.
Moha le tout-puissant chameau
ok, alors, tu attrapes quelque chose avec de la couleur? comme un code html? Si vous voyez une couleur dans l'entrée, elle doit être formatée et donc codée quelque part, comme "fontcolor: red", n'est-ce pas? Si tel est le cas, vous devrez peut-être inclure le code de formatage dans votre grep. :)
Rho
ok, avec l'édition dans la question je l'obtiens. :) Quelle extension de sortie utilisez-vous?
Rho
Je cherche un code Perl, quand j'ai utilisé l'extension Perl, j'ai eu une coloration syntaxique complète, et je suis un nom de variable pour qu'il ne soit même pas coloré.
Moha le tout-puissant chameau