Risposte:
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".
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.
--color=autosarebbe necessario per il secondo grep, subito dopo 'keyword2'.
--color=alwaysla risposta, perché potresti voler convogliarla lesso qualcosa del genere.
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
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).