grep: come colorare 2 parole chiave?


12

So come grep 2 parole chiave usando 1 comando, ma riesco solo a colorarne una nell'output. Ecco il mio comando:

grep 'keyword1' file.log | grep 'keyword2'

Solo keyword2è evidenziato. Come posso keyword1evidenziare allo stesso tempo?

Risposte:


15

Il grepcomando accetta --color=alwaysun'opzione, quindi puoi usarlo

grep 'keyword1' file.log --color=always | grep 'keyword2'

Come sottolinea gertvdijk , questo comando potrebbe essere inefficiente, ma cercherà tutte le righe che contengono sia keyword1 che keyword2. Se si desidera evidenziarli in diversi colori, è possibile utilizzare

grep 'keyword1' file.log --color=always | GREP_COLORS="mt=01;34" grep --color=always 'keyword2'

che evidenzierà keyword2 in blu. La mtparte indica che grepevidenzierà il testo corrispondente usando questo codice CSI e 01;34significa "primo piano blu in grassetto su sfondo normale".


1
+1 per spiegazioni dettagliate e opzioni di personalizzazione per il caso d'uso!
gertvdijk,

Divertente, quando provo questo con: grep -R --color = always keyword1. | grep keyword2 // viene evidenziata solo la prima parola chiave. Come posso adattare la tua risposta al lavoro con la ricerca ricorsiva?
TenLeftFingers

1
È strano, grep -R --color=always keyword1 . | grep keyword2dovrebbe funzionare. Stai reindirizzando nuovamente l'output (ad esempio eseguendo il piping del secondo grepin less -R)? In tal caso, dovrai aggiungere anche --color=alwaysal secondo.
Daniel H

Bella risposta! Per evidenziare entrambi, un --color=autosarebbe necessario per il secondo grep, subito dopo 'keyword2'.
Luis

@Luis Sì, hai ragione sul fatto che Grep almeno per impostazione predefinita non assume alcun colore (anche se potrebbe essere un'opzione di configurazione-tempo? Non credo di averlo annullato nel 2013 quando ha funzionato sulla mia macchina senza quello ...). Ho aggiunto --color=alwaysla risposta, perché potresti voler convogliarla lesso qualcosa del genere.
Daniel H,

3

Prova le espressioni regolari effettive, anziché eseguire il piping a un'altra istanza di grep, ad esempio:

grep -E "\<foo\>.*\<bar\>" file

Questo limita le linee corrispondenti in cui questo corrisponde solo alle parole chiave in questo ordine, sfortunatamente. Comunque, l'uso di grepnella tua domanda è piuttosto inefficiente e dovresti evitarlo. La risposta di @DanielH è probabilmente molto più semplice per il tuo caso, probabilmente.

Per una corrispondenza "o" di parole chiave, lo uso regolarmente:

grep -E "(foo|bar)" file

1
Penso che l'OP voglia solo linee che contengono entrambe le parole chiave (il comando che hai dato dà tutte le linee che contengono una delle due parole chiave).
Daniel H,

@DanielH Grazie per averlo sottolineato. Ho aggiornato la mia risposta.
gertvdijk,

Non funziona ancora solo se foo viene prima della barra? Non so se c'è un modo migliore di foo.*bar|bar.*foo, o se è persino necessario per questo caso (che sembra essere un file di registro che probabilmente avrebbe un ordine standard per le parole chiave). Ho aggiunto la mia risposta prima che tu abbia aggiornato la tua, ma la terrò in giro nel caso in cui ci sia una situazione in cui grepsono davvero necessari concatenati (o qualsiasi altra volta che l'output colorato non dovrebbe essere inviato al terminale, come grep | less -R).
Daniel H,
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.