Respostas:
O grep
comando aceita uma --color=always
opçã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 mt
parte significa que grep
destacará o texto correspondente usando esse código CSI e 01;34
significa "primeiro plano em negrito azul em fundo normal".
grep -R --color=always keyword1 . | grep keyword2
deve funcionar. Você está redirecionando a saída novamente (como canalizando a segunda grep
em less -R
)? Nesse caso, você precisará adicionar --color=always
ao segundo também.
--color=auto
seria necessário para o segundo grep
, logo após 'keyword2'
.
--color=always
à resposta, porque você pode querer canalizá-la less
ou 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 grep
na 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.*foo
ou 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 grep
s realmente sejam encadeados (ou qualquer outra saída colorida não deve ser enviada ao terminal, como grep | less -R
).