Uscita Grep con più colors?

C’è un metodo elegante in bash di eseguire grep su un file di testo con 2 o più pattern, e ogni pattern che corrisponde è prodotto in un colore diverso?

Quindi una riga che corrisponde a MALE e AUGUST potrebbe mettere MALE in blu e AUGUST in arancione? Sono aperto all’uso di sed , awk , grep e pastelli o altro …

Puoi eseguire la cascata di greps con colors diversi specificando –color = sempre e usando l’espressione regolare ‘foo | $’ per passare tutte le linee.

Per esempio:

 tail -f myfwlog | GREP_COLOR='01;36' egrep --color=always 'ssh|$' | GREP_COLOR='01;31' egrep -i --color=always 'drop|deny|$' 

Se vuoi che l’intera linea sia evidenziata, aggiorna la tua espressione regolare di conseguenza:

 .... GREP_COLOR='01;31' egrep -i --color=always '^.*drop.*$|^.*deny.*$|$' 

grep è un matcher di espressioni regolari, non un evidenziatore di syntax :). Dovrai utilizzare più richiami di grep , utilizzando un valore diverso di GREP_COLOR per ciascuno.

 GREP_COLOR="1;32" grep foo file.txt | GREP_COLOR="1;36" grep bar 

Questo evidenzierebbe “foo” e “bar” in diversi colors in linee che corrispondono a entrambi. Non penso che esista un (semplice) modo di gestire tutte le occorrenze di entrambi i pattern, a meno di unire il stream di output di due chiamate indipendenti:

 { GREP_COLOR="1;32" grep foo file.txt GREP_COLOR="1;36" grep bar file.txt } | ... 

che apparirà evidentemente diverso rispetto a un modo per assegnare un colore separato a ciascuna espressione regolare.


Puoi usare awk per sostituire ogni partita con se stesso avvolto nel codice di controllo corretto.

  echo "foo bar" | awk '{ gsub("bar", "\033[1;33m&\033[0m"); gsub("foo", "\033[1;36m&\033[0m"); print }' 

In ogni riga, sostituisci globalmente qualsiasi cosa corrisponda all’espressione regolare data con se stessa ( & ) avvolta nelle sequenze di escape ANSI per il colore desiderato (che grep --color fa per te). Dopo aver elaborato tutte le possibili corrispondenze, è necessario stampare esplicitamente la riga.

Se vuoi qualcosa fuori dalla scatola, probabilmente stai cercando l’ hhighlighter .

Ecco un esempio: Uscita JBoss

Guarda. È incredibilmente utile per colorare automaticamente le parole in diversi colors. È un progetto impressionante che è stato costruito in cima al mondo.

Ho avuto bisogno di evidenziare stringhe nei file di testo e non ho trovato un modo adatto alle mie esigenze, quindi ho scritto un semplice programma C per colorare le stringhe che corrispondono alle espressioni regolari.

Puoi scaricare il codice sorgente da GitHub:

 git clone http://github.com/mbornet-hl/hl 

poi :

 cd hl/cr; make 

Ecco l’uso:

 hl: version 1.21 Usage: hl [-h|-eidD][-E][-rgybmcwRGYBMCW] regexp ... -h : help -v : version -u : do not bufferize output on stdout -e : extended regular expressions -i : ignore case -E : print on stderr -r : red -g : green -y : yellow -b : blue -m : magenta -c : cyan -w : white -R : red (reverse video) -G : green (reverse video) -Y : yellow (reverse video) -B : blue (reverse video) -M : magenta (reverse video) -C : cyan (reverse video) -W : white (reverse video) -d : debug -D : display regular expressions 

Per colorare la parola “rosso” in rosso e la parola “blu” in blu, devi solo digitare il seguente comando:

 echo "red blue red blue" | hl -r red -b blue 

ed ecco un esempio per evidenziare l’output del comando ifconfig:

 hl -ei -m '^(eth|(vir)?br|vnet)[0-9.]*:[0-9]+\>' \ -b '^(eth|(vir)?br|vnet)[0-9.]*\.[0-9]+\>' \ -c '([0-9a-f]{2}:){5}[0-9a-f]{2}' \ -g '\|\|([0-9]{1,3}\.){3}[0-9]{1,3}\>' \ -y '^(eth|(vir)?br|vnet)[0-9.:]*\>' \ -W '[0-9a-f]{4}::[0-9a-f]{4}\:[0-9a-f]{4}:[0-9a-f]{4}:[0-9a-f]{4}' \ -r ' (errors|dropped|overruns):[^0][0-9]*' 

L’ordine in cui specifichi i colors è importante: se una stringa corrisponde a più espressioni regolari, la prima come priorità più alta della seconda, la seconda come priorità più alta della terza e così via …

Spero che questo ti aiuti.

Prova il meraviglioso rpen http://github.com/rtulke/rpen

richiede egrep o grep

cp rpen.py / usr / local / bin / rpen chmod 777 / usr / local / bin / rpen

quindi prova

ps xau | rpen Ss “S +” “\? \?”

Quindi ecco la versione (s) utilizzando sed. Diciamo che vuoi che la parola “FAILED” sia colorata in rosso, che sarebbe:

 sed 's/\(ERROR\)/\o033[31m\1\o033[39m/' 

Per avere l’intera riga contenente la parola “FAILED” segnata in rosso:

 sed 's/\(.*ERROR.*\)/\o033[31m\1\o033[39m/' 

Per avere più parole contrassegnate in rosso:

 sed 's/\(ERROR\|FAILED\)/\o033[31m\1\o033[39m/' 

Per avere più parole e le loro linee wohle segnate in rosso:

 sed 's/\(.*FAILED.*\|.*ERROR.*\)/\o033[31m\1\o033[39m/' 

Per avere più colors (ERROR = rosso / FAILED = blu)

 sed -e 's/\(ERROR\)/\o033[31m\1\o033[39m/' -e 's/\(FAILED\)/\o033[34m\1\o033[39m/' 

Per usare tutto questo su ssh:

 ssh [email protected] -t "tail -n 1024 -f /some/log/file | sed --unbuffered -e 's/\(.*ERROR.*\|.*FAILED.*\)/\o033[31m\1\o033[39m/' -e 's/\(.*postfix.*\|.*dhcpd.*\)/\o033[32m\1\o033[39m/'" 

E per non doverlo digitare ogni volta, basta dichiararlo come una funzione nella tua bascrc.

Per altri colors, cerca i codici ANSI.

Cosa ne pensi di questo? Puoi farlo SOLO con grep! I trucchi qui sono (1) che prendi / OR / delle parole che stai cercando; (2) utilizzate le opzioni -A e -B con numeri abbastanza grandi (maggiori del numero di righe del vostro file).

 echo "you make it" > tmp echo "you take it" >> tmp echo "you cake it" >> tmp echo "you bake it" >> tmp echo "you wake it" >> tmp GREP_COLOR='1;32' grep -P "(take|cake|bake)" --color=always tmp | GREP_COLOR='1;33' grep -P "(cake|bake)" --color=always -A10000 -B10000 | GREP_COLOR='1;34' grep -P "(bake)" --color=always -A10000 -B10000 

cxpgrep è giusto per questo scopo – evidenzia i modelli in diversi colors.

 cxpgrep 'PAT1|PAT2|...' FILE_OR_DIRECTORY 

La mia risposta è qui sotto:

 tailf logfile awk '/MALE/' {print "\033[34m" $0 "\033[39m"} '/MALE/' {print "\033[33m" $0 "\033[39m"}