Conserva la colorazione dopo aver convogliato grep in grep


140

C'è una domanda semplice nella conservazione della colorazione dopo il grep, ma mi dà fastidio che se si inoltra l'output grep colorato in un'altra grep, la colorazione non viene conservata.

Ad esempio grep --color WORD * | grep -v AVOID, non mantiene il colore del primo output. Ma per me ls | grep FILEmantieni il colore, perché la differenza?


2
Questa domanda sembra fuori tema perché riguarda l'utilizzo del comando Unix, appartiene a unix.stackexchange.com
Raptor

Risposte:


162

grepa volte disabilita l'output del colore, ad esempio quando si scrive su una pipe. È possibile ignorare questo comportamento congrep --color=always

La riga di comando corretta sarebbe

grep --color=always WORD * | grep -v AVOID

Questo è piuttosto dettagliato, in alternativa puoi semplicemente aggiungere la linea

alias cgrep="grep --color=always"

ad .bashrcesempio e utilizzare cgrepcome grep colorato. Quando si ridefinisce, grepè possibile che si verifichino problemi con gli script che si basano sull'output specifico di grepe non amano il codice di escape ASCII.


4
Questa soluzione funziona solo in determinate circostanze fortunate. Vedi la risposta di andersonvom di seguito.
Studog

Nel mio caso (Ubuntu) avevo già un alias grep. alias grep='grep --color=autoquindi devo solo modificare il mio ~/.bashrcdove è stato definito in primo luogo.
sobi3ch,

Non funziona per me - simile a questo scenario stackoverflow.com/a/7640077/248616
Nam G VU

Questa bella idea creativa è semplice e funzionante stackoverflow.com/a/36288791/248616
Nam G VU

la domanda è su come rendere il secondo grep non sopprimere il colore del primo. Questa non è una risposta a questo.
johannes_lalala,

74

Un consiglio:

Durante l'utilizzo grep --color=always, le stringhe effettive che vengono passate alla pipe successiva verranno modificate. Questo può portare alla seguente situazione:

$ grep --color=always -e '1' * | grep -ve '12'
11
12
13

Anche se l'opzione -ve '12'dovrebbe escludere la linea di mezzo, non lo sarà perché ci sono caratteri di colore tra 1e 2.


Se lo usi --color=auto, allora dovrebbe capire il fatto che lo stai tubando da qualche altra parte e sopprimere del tutto i colori, ma in qualche modo sconfigge lo scopo. Se vuoi ancora risultati colorati, immagino che potresti usarlo nuovamente all'ultima pipe usando --color.
Andersonvom,

2
Almeno su Mac OS X, colorare all'ultima pipe come suggerisce @andersonvom non funziona. Non so perché; forse sta colorando il modello escluso? --color=alwaysfunziona, con, suppongo, le avvertenze di cui sopra.
user766353,

3
Devi avere lo stesso modello grep due volte nella tua espressione. Ho appena provato questo su un Mac: http://i.imgur.com/BhmwAlF.png
andersonvom,

9

Basta ripetere lo stesso comando grep alla fine della pipa.
grep WORD * | grep -v AVOID | grep -v AVOID2 | grep WORD


2
L'inversione dei comandi non fornirebbe lo stesso risultato? grep -v AVOID * | grep WORD
Brydon Gibson

@BrydonGibson probabilmente, ma è stato un esempio per dimostrare che funziona per qualsiasi numero di comandi inoltrati
Alex
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.