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?

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


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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.