Contrassegna le occorrenze della parola chiave con un colore diverso


13

Ho un programma che sputa un output stdoutcome:

[OK]      Something is ok
[OK]      Something else is also ok
[FAIL]    This does not look good
[FAIL]    Neither does this
[OK]      At least this is fine

Per individuare più facilmente i guasti dall'output, desidero contrassegnare le occorrenze della parola chiave FAILcon il rosso senza eliminare gli altri messaggi. Sarebbe bello se potessi anche evidenziare le OKparole chiave con il verde :).

Fare una pipe per egrep --color FAILmostrerà solo le linee in cui FAILè presente la parola chiave.


1
Per una grepsoluzione, consultare unix.stackexchange.com/a/34322
manatwork

hai accesso per cambiare il codice sorgente? è uno script bash?
h3rrmiller,

@manatwork Dal link che hai specificato ho fatto clic sul mio modo di stackoverflow.com/questions/972370 e con alcuni tail -fe la awkmagia, sono bravo ad andare =)
Theodor

Risposte:


10

Sulla base manatworkdel piccolo brillante "o niente" hack nell'altra domanda, offro questo, che aggiunge la possibilità di ottenere due colori di evidenziazione:

 $ myprogram | \
   GREP_COLORS='mt=01;32' egrep --color=always '\[OK\]|' | \
   GREP_COLORS='mt=01;31' egrep --color=always '\[FAIL\]|'

Cioè, si esegue grepl'output due volte, con una GREP_COLORSvariabile di ambiente diversa ogni volta.

Il valore '01; 32 'significa "grassetto verde" e l'altro significa "grassetto rosso". Vedi l' articolo di Wikipedia sui codici ANSI per ulteriori idee.

Purtroppo, ciò richiede GNU grep versione 2.5.3 o successiva. Le versioni precedenti di GNU grep supportavano un diverso meccanismo di colorazione, ma quelle versioni hanno un bug che ti impedisce di usare la funzione in una pipeline più di una volta. BSD grep emula il vecchio meccanismo di colorazione GNU grep e funzionerà due volte in una pipeline, ma grida "sottoespressione vuota" a causa manatworkdell'hacking.

È possibile rimuovere le barre rovesciate alla fine delle prime due righe per rendere tutto una singola riga. L'ho appena diviso qui per chiarezza e per giocare bene con il formato di pagina SE.


Questo è davvero geniale! Ma per qualche ragione la sceneggiatura non sembra evidenziare la seconda affermazione sulla mia macchina. Gestisco CentOS 5.
Theodor,

2
Quello che sta succedendo qui è che CentOS 5 spedisce un grep GNU abbastanza vecchio da non supportare GREP_COLORS, al plurale. Utilizza GREP_COLORsolo il metodo precedente e quel metodo contiene un bug che gli impedisce di fare la cosa giusta. Se cambi il comando da usare GREP_COLOR=32e così, cambierà solo il colore di evidenziazione della prima corrispondenza. Se installi il risultato attraverso hexdump -c, puoi vedere che l'aggiunta del secondo egrepcomando fa qualcosa, ma non è ANSI legale. In conclusione: devi aggiornare grepper farlo funzionare correttamente.
Warren Young,

Haha è un commento così penetrante. Sì, CentOS5 sta diventando un po 'vecchio, come con molti sistemi operativi: in esecuzione su una vecchia macchina che sputa vecchi messaggi di log dimenticati da Dio :) Cercherò di vedere se un aggiornamento a centos6 non è possibile.
Theodor,

Ho appena controllato la mia soluzione su una CentOS 6 box, e lo fa lavorare lì, confermando la mia diagnosi. (I test precedenti erano su server Ubuntu.) EL6 viene fornito con GNU grep 2.6.3. È interessante notare che hanno anche corretto il GREP_COLORbug (singolare), anche se la funzione era obsoleta non appena sostituita.
Warren Young,

Non riesco a capire come questo risolva il problema poiché il primo grep filtrerà tutto il "FAIL", quindi non rimarrà nulla per il secondo grep da abbinare ..
Laertis,

1

È possibile utilizzare multitail o ccze per questo, entrambi consentono alle configurazioni di descrivere regexps da abbinare e colori.


1

Sulla base della risposta di Warren Young, ho scritto questo script Python che fa la stessa cosa in modo più elegante e con molta meno battitura. Quindi è così che useresti quello script:

cat yourfile | himul '\[OK\]' '\[FAIL\]'
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.