Output colorato in shell: grep, less, journalctl e GRC

Come rendere leggibili log e output da terminale senza rompere pipe e script: grep --color, GREP_COLORS, less -R, journalctl, GRC/grcat e alias interattivi sicuri.

Il colore in terminale non è soltanto decorazione. Quando analizziamo centinaia di righe di log, evidenziare uno status, un IP o la parola ERROR riduce il tempo necessario a trovare ciò che interessa. Il trucco è farlo senza trasformare l’output in una foresta di escape ANSI che rompe file, pipe e script.

Colore automatico soltanto sul terminale

Molti comandi supportano una modalità auto: inseriscono colore quando stdout è un terminale interattivo e lo disattivano quando l’output viene rediretto.

grep --color=auto ERROR /var/log/app.log

grep --color=auto -nE 'ERROR|WARNING' /var/log/app.log

GNU grep usa GREP_COLORS per personalizzare l’evidenziazione:

export GREP_COLORS='ms=01;31:mc=01;31:fn=35:ln=32:se=36'

grep --color=auto -n 'denied' auth.log

Evitiamo --color=always nelle pipeline salvo quando sappiamo che il consumer comprende le escape sequence.

less e codici colore

grep --color=always -nE 'ERROR|WARNING' app.log |
    less -R

-R è preferibile al più permissivo -r quando vogliamo visualizzare principalmente sequenze colore senza consentire indiscriminatamente qualunque carattere di controllo.

tail -F + grep

tail -F /var/log/app.log |
    grep --line-buffered --color=always -E 'ERROR|WARNING|CRITICAL'

journalctl

journalctl -u ssh -f
journalctl -p warning --since "-30 min"
journalctl -u apache2 -o short-iso-precise

Prima di colorare tutto scegliamo un formato che mostri timestamp e contesto utili. Il colore non può compensare un log povero.

GRC: Generic Colouriser

GRC, già protagonista dell’articolo originale del 2016, esiste ancora ed è tuttora utile. grc esegue un comando e passa l’output a grcat, che applica regole basate su regular expression.

apt install grc

grc ping 1.1.1.1
grc ps aux
grc tail /var/log/syslog

Possiamo usare direttamente grcat:

tail -F /var/log/syslog |
    grcat conf.log |
    less -R

Configurazione GRC personalizzata

# ~/.grc/conf.myapp

regexp=\b(ERROR|CRITICAL|FATAL)\b
colours=bold red
count=more
=======
regexp=\b(WARN|WARNING)\b
colours=yellow
count=more
=======
regexp=\b(INFO)\b
colours=green
count=more
tail -F /var/log/myapp.log |
    grcat ~/.grc/conf.myapp

Alias: non cambiare silenziosamente i comandi base

Il vecchio articolo suggeriva alias tail='grc tail'. In una shell interattiva può funzionare, ma preferisco alias distinti:

alias ctail='grc tail'
alias cps='grc ps'
alias cping='grc ping'

alias grep='grep --color=auto'

Negli script è meglio invocare esplicitamente i comandi invece di dipendere dagli alias della shell dell’utente.

Non salvare escape ANSI nei log

I colori dovrebbero essere applicati in visualizzazione, non incorporati nel log persistente. Sequenze ANSI nei file complicano parsing, ricerca, ingestione SIEM e confronti con strumenti non terminali.

Colore e incident response

Durante un incidente il colore è utile per leggere rapidamente, ma non deve diventare parte della logica. Le query devono funzionare anche senza colore e i parser devono basarsi sui dati, non sulla resa visiva.

Per organizzare logging locale e remoto vedi Logging su Linux: journald, rsyslog e log remoto.

Riferimenti

GNU grep manual · GRC / Generic Colouriser.