Respostas:
O grepcomando aceita uma --color=alwaysopção, para que você possa usar
grep 'keyword1' file.log --color=always | grep 'keyword2'
Como gertvdijk aponta , esse comando pode ser ineficiente, mas procurará todas as linhas que contenham palavra-chave1 e palavra-chave2 . Se você quiser destacá-los em cores diferentes, poderá usar
grep 'keyword1' file.log --color=always | GREP_COLORS="mt=01;34" grep --color=always 'keyword2'
que destacará a palavra-chave2 em azul. A mtparte significa que grepdestacará o texto correspondente usando esse código CSI e 01;34significa "primeiro plano em negrito azul em fundo normal".
grep -R --color=always keyword1 . | grep keyword2deve funcionar. Você está redirecionando a saída novamente (como canalizando a segunda grepem less -R)? Nesse caso, você precisará adicionar --color=alwaysao segundo também.
--color=autoseria necessário para o segundo grep, logo após 'keyword2'.
--color=alwaysà resposta, porque você pode querer canalizá-la lessou algo assim também.
Tente expressões regulares reais, em vez de canalizar para outra instância de grep, por exemplo:
grep -E "\<foo\>.*\<bar\>" file
Isso limita as linhas correspondentes nas quais essas palavras-chave correspondem somente nesta ordem, infelizmente. De qualquer forma, o uso de grepna sua pergunta é bastante ineficiente e você deve evitá-lo. A resposta de @DanielH é bem mais direta para o seu caso, provavelmente.
Para uma correspondência "ou" de palavras-chave, eu uso isso regularmente:
grep -E "(foo|bar)" file
foo.*bar|bar.*fooou se isso é necessário para este caso (que parece ser um arquivo de log que provavelmente teria um pedido padrão para as palavras-chave). Eu adicionei minha resposta antes que você atualize a sua, mas continuarei assim, caso haja uma situação em que greps realmente sejam encadeados (ou qualquer outra saída colorida não deve ser enviada ao terminal, como grep | less -R).