Come posso conservare i codici colore con input grep?


15

Se utilizzo due grepcomandi consecutivi , ad esempio:

echo "foo bar" | grep foo | grep bar

Quindi il primo motivo ("pippo") non è evidenziato. In effetti, sembra che grep rimuova i codici colore dal suo input. C'è un modo per impedirlo?


Un'altra domanda con la stessa risposta: come si può ripristinare un output colorato in un grep all'interno di una funzione bash?
Camille Goudeseune,

Risposte:


23

Usa --color=always.

greprileva se l'output è in una pipe (o file). La maggior parte dei colori non è mai richiesta quando l'output deve essere archiviato, poiché si tratta di sequenze di escape per il terminale. Tipicamente:

foo ^[[01;31m^[[Kbar^[[m^[[K

da es:

grep pattern file > result

Per ignorare l'uso --color=always.

grep --color=always pattern file | ...

Esempio:

Avendo file:

ID=111;Year=2013;foo=bar
ID=222;Year=2013;foo=baz

Poi

grep --color=always ID file | grep --color=always 2013 | grep foo

colora ID, 2013e foo.

grep --color=always ID file | grep 2013 | grep foo

colorerebbe IDe foo, ma non 2013.

1 Importante: devi anche ricordare che il disordine aggiuntodai colori viene passato al comando successivo nella catena. Una volta che l'ID è colorato, non puoi (con facilità), abbinare ad esID=111.


In alcune occasioni si potrebbero desiderare colori terminali nel file . Prova ad es

 grep --color=always foo file > result
 cat result

Sebbene il file risultante avrebbe una portabilità molto limitata.


La colorazione stessa è anche un'estensione.


Come accennato dal buon @slm , è possibile aggiungere:

export GREP_OPTIONS="--color=always"

al tuo .bashrcecc., ma non farlo a meno che tu per qualche motivo non capisca davvero le implicazioni e desideri ancora farlo. In molti modi si spezzerebbe a grepcausa del fatto di cui sopra 1 .

Aggiungi un aliasse lo usi spesso.

 alias cgrep='grep --color=always'

GREP_OPTIONSe --color prendere tre opzioni : never, autoe always. I primi due dovrebbero essere gli unici considerati GREP_OPTIONS.

Si potrebbe anche verificare GREP_COLORSnelle manpagine o GNU grep .


Ulteriori dettagli su questi metodi pro / contro qui: stackoverflow.com/questions/867877/…
slm

1
aggiungi anche questo alla risposta: export GREP_OPTIONS="--color=always"in un .bashrc le opzioni sono quelle predefinite per qualsiasi greps, e tu l'hai praticamente inchiodato!
slm

Roba buona in questo Q&A Super Uuser: superuser.com/questions/36022/…
slm

"grep rileva se l'output è indirizzato a una pipe" - aha! Questa è la chiave, grep non sta colorando se fa parte di una pipa. Dovrebbe esserci un principio di sostituzione contro questo genere di cose: - /
Chris2048,

@ Chris2048: questo è standard per la maggior parte degli strumenti che stampano i colori sul terminale. Potresti trovare qualche dettaglio in più su questo , su come viene rilevato, e questo mostra alcuni problemi, ad esempio ls e colori, su lscoreutils nativi e gnu di OSX.
Runium,
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.