Salvataggio dell'output di un grep in un file con colori


36

Devo salvare il risultato di un comando grep in un file, ma voglio anche che il file di output sia formattato e mantenga i colori proprio come nel terminale.

C'è un modo per farlo? Forse far salvare grep in un qualche tipo di linguaggio di markup? Se ciò non è possibile, esiste un altro strumento in grado di svolgere questo compito?

Sto cercando di far risaltare la parola chiave di ricerca nel file di output, esattamente come nel terminale.

Risposte:


43

Per mantenere il markup, hai bisogno di più di un semplice file di testo. Userei l'output HTML per mantenere i colori.

  • Installa aha cioè "converte le sequenze di escape ANSI di un terminale unix in codice HTML "

    sudo apt-get install aha
  • quindi salva il tuo grep(o ls) output in questo modo:

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

    opzioni:

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

Evidenziazione della sintassi per l'estensione del file tramite pygmentize

  • installare pygmentize:

    sudo apt-get install python-pygments
  • quindi esegui questo tipo di comando:

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

inserisci qui la descrizione dell'immagine


1
AHA !! , aha è uno strumento davvero meraviglioso, esattamente quello che stavo cercando, grazie !!
Moha, l'onnipotente cammello, il

2
@ Mhd.Tahawi: ho aggiornato la mia risposta in modo da poter mantenere i colori del codice (perl nel tuo caso), ma pygmentizefunziona con molti altri.
Sylvain Pineau,

10

A seconda di cosa si desidera fare con il file di output, è possibile aggiungere colori a un normale file di testo perché i colori provengono semplicemente da alcuni caratteri speciali. Grep sembra non voler stamparli quando lo si reindirizza su un file, quindi è necessario forzarlo a:

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

Ora, quando stampi il file sulla console, questo verrà stampato con i colori, perché Bash interpreta quei caratteri come "usa questo colore".

cat output.txt

Tuttavia, se lo apri in un editor come vim, otterrai alcuni strani personaggi. Ad esempio, quando uso i comandi

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

L'output appare corretto quando lo stampo usando catma quando lo apro vimottengo

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

Quindi, se vuoi usare un editor, questo probabilmente non è quello che vuoi.


Esatto !!, stavo mettendo in mezzo quegli strani simboli e non capivo cosa fossero quelli.
Moha, l'onnipotente cammello, il

mi piace davvero quanto sia semplice / efficace la tua risposta. basta cat l'output :). questo è ottimo per un breve periodo (abbastanza buono per me in questo momento).
Trevor Boyd Smith,

Dettaglio: è il terminale (emulatore), non bash, che interpreta le sequenze di escape del colore (alias strani personaggi).
masterxilo,

2

Se ho capito bene vuoi salvare un output del terminale in un file di testo, giusto? Ma vuoi che sia formattato con i colori. In tal caso, ecco le mie idee:

Evidenziando automaticamente l'uscita

Come probabilmente saprai, se catturi un output grep in un file di testo, proprio perché è un file di testo non può essere formattato. Quindi, per quanto ne so, non puoi farlo in modo semplice.

Nonostante ciò, esiste una semplice soluzione, che consiste nel far realizzare al tuo editor di testo quale tipo di file si sta aprendo. Ad esempio, supponiamo che l'output di grep abbia alcuni componenti bash, quindi le alte luci bash funzionano per te (a proposito, questi sono spesso i colori che vedi in un output colorato nel terminale). Quindi il trucco è salvare l'output del testo in un file con l'estensione corretta. Invece di fare qualcosa del genere:

ls | grep something > output

potresti andare per

ls | grep something > output.sh

Il che farà riconoscere automaticamente a gedit (o qualsiasi editor di testo decente) che stai parlando di codice bash e lo evidenzierà di conseguenza. Non è necessario colorare l'output, il programma lo farà per te se riconosce il tipo di codice che sta aprendo. Se stai lavorando con altri tipi di formati, basta adattare l'estensione a quella regolazione migliore per ciò su cui stai grepping (ad es.> Output.xml,> output.html,> output.py ... ecc.). In bocca al lupo! :)

Evidenziando alcune parole nel file di output

Quindi, se ho capito, vuoi evidenziare le parole che hai cercato. Ancora una volta, ciò non può essere fatto in un file di testo semplice solo perché è un testo semplice. Tuttavia, è possibile aggiungere un formato ad esso in un modo molto semplice, ad esempio utilizzando un po 'di codice HTML. Questo trasformerà il tuo output in un codice html e quando lo aprirai con un programma in grado di interpretare html (libreoffice writer, firefox e 10000 etceteras) vedrai alcune parole evidenziate.

Per fare questo, supponiamo che questo sia il tuo grep, esportato in HTML:

ls | grep keytext > output.html

E ora vuoi evidenziare il testo chiave nel tuo output. Puoi usare sed per farlo, come:

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

E violà, ora il tuo testo chiave è evidenziato in rosso.


1
bella idea !!, ma non sto cercando l'evidenziazione della sintassi. sai come grep colora la parola chiave di ricerca con un altro colore, di solito rosso. Voglio mantenerlo così la parola chiave più evidente nel file di output.
Moha, l'onnipotente cammello, il

ok, allora, stai piangendo qualcosa con il colore? come un codice HTML? Se vedi il colore nell'input, allora deve essere formattato e quindi codificato da qualche parte, come "fontcolor: red", giusto? In tal caso, potrebbe essere necessario includere il codice di formattazione nel grep. :)
Rho,

ok, con la modifica nella domanda ho capito. :) Quale estensione di output stai usando?
Rho,

Sto grepping un codice perl, quando ho usato l'estensione perl, ho ottenuto una colorazione completa della sintassi e sto grepping un nome variabile quindi non era nemmeno colorato.
Moha, l'onnipotente cammello, il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.