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.