grep: como colorir duas palavras-chave?

12

Eu sei como grep 2 palavras-chave usando 1 comando, mas só consigo colorir uma delas na saída. Aqui está o meu comando:

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

Somente keyword2é destacado. Como posso keyword1destacar ao mesmo tempo?

Raptor
fonte

Respostas:

15

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".

Daniel H
fonte
1
+1 para explicação detalhada e opções de personalização para o caso de uso!
Gdvdijk
Engraçado, quando tento isso com: grep -R --color = always keyword1. | grep palavra-chave2 // somente a primeira palavra-chave é destacada. Como eu poderia adaptar sua resposta para trabalhar com pesquisa recursiva?
TenLeftFingers
1
Isso é estranho, 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.
Daniel H
Ótima resposta! Para destacar os dois, um --color=autoseria necessário para o segundo grep, logo após 'keyword2'.
Luis
@Luis Sim, você está certo de que o Grep, pelo menos com frequência, não possui cores (embora isso possa ser uma opção de tempo de configuração? Eu adicionei --color=alwaysà resposta, porque você pode querer canalizá-la lessou algo assim também.
Daniel H
3

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
gertvdijk
fonte
1
Eu acho que o OP quer apenas linhas que contenham ambas as palavras-chave (o comando que você forneceu fornece todas as linhas que contêm uma).
Daniel H
@ DanielH Obrigado por apontar isso. Eu atualizei minha resposta.
gertvdijk
Isso ainda não funciona apenas se foo vem antes do bar? Não sei se existe uma maneira melhor do que 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).
Daniel H