web-dev-qa-db-fra.com

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

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.

36

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

  • Installez aha c'est-à-dire "convertit les séquences d'échappement ANSI d'un terminal unix en code HTML "

    Sudo apt-get install aha
    
  • puis enregistrez votre sortie grep (ou ls) 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
    

enter image description here

42
Sylvain Pineau

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 tel que 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 cat mais lorsque je l’ouvre dans vim j’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.

10
MasterOfBinary

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 c’est 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 contienne 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 keytext dans votre sortie. Vous pouvez utiliser sed pour le faire, par exemple:

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

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

2
Rho