Obter resultados coloridos ao usar um tubo de grep para menos

246

Eu uso muito a opção --colour do grep, mas geralmente uso menos também. Como posso canalizar menos os resultados de grep e ainda preservar a coloração. (Ou isso é possível?)

grep "search-string" -R * --colour | less 

EDIT :

Estou procurando uma solução direta ou algo equivalente a isso.

Jeremy Powell
fonte
possível duplicado de Obter cores no comando 'menos' #
Ciro Santilli
O que *faz? Na página de manual do grep: *: The preceding item will be matched zero or more times.Mas eu ainda não entendo ..! @JeremyPowell
Shayan

Respostas:

274

Quando você simplesmente executa grep --color, implica em grep --color=autoqual detecta se a saída é um terminal e, em caso afirmativo, ativa as cores. No entanto, quando detecta um tubo, desativa a coloração. O seguinte comando:

grep --color=always -R "search string" * | less

Sempre habilitará a cor e substituirá a detecção automática, e você obterá a cor destacada less.

EDIT: Embora o uso apenas lessfuncione para mim, talvez a versão mais antiga exija o -Rsinalizador para manipular cores, como sugerido a partir daí.

drrlvn
fonte
143
Você precisa usar less -Rpara que a codificação de cores seja interpretada de maneira menos correta
daí
1
Funcionou para mim com apenas less, pode ser dependente da versão.
drrlvn 5/09/09
1
Um adendo (espero) útil: eu precisava excluir algumas correspondências, mas manter a coloração, então acabei realmente grep pattern file | grep -v badpattern | grep --colour=always pattern | less -R, o que atendeu às minhas necessidades perfeitamente. (Obrigado mais uma vez!)
Owen Blacker
7
Não acredito que eles implementaram o recurso de manipulação de cores lesse, portanto, perderam a chance de ter uma colorlessferramenta especial . Só pelo nome, deveria ter sido feito! Provavelmente eu deveria escrever um patch que chama -R automaticamente quando o binário é executado como colorless.
Christian
2
@OwenBlacker Pode não ser um alias. Você pode ter $LESSdefinido com -R.
greyfade
27

Você pode colocar isso no seu .bashrcarquivo:

export GREP_OPTIONS="--color=always"

ou crie um alias como este:

alias grepc="grep --color=always"

e você precisará usar a -Ropção para less, como apontado por lá

Dennis Williamson
fonte
29
Aviso !: GREP_OPTIONS = "- color = always" pode interromper muitos scripts que usam grep (ou (e | f) grep).
Mctylr 12/03/10
4
Sim, melhor apenas alias grep. Você sempre pode obter pura grepcom GREPou substituir o --coloropção manualmente.
asmeurer
Isso não funciona para mim, mas aliás funciona.
Saeedgnu
9

Nesse caso, eu prefiro criar pequenos arquivos sh e colocá-los /usr/local/bin.
Eu costumo usar de grepmaneira recursiva no pwd, então esse é o meu script pessoal:

#!/bin/sh
grep --color=always -r "$@" . | less -R

E então eu apenas copiei como /usr/local/bin/g(sim, eu uso muito)

Iazel
fonte
2
Por que não usar apenas funções de shell para esse tipo de coisa? g() { grep --color=always -r "$@" . | less -R }funciona de forma idêntica e provavelmente fornecerá (minuciosamente) melhor desempenho.
0000
1
@ 00dani sim, é uma alternativa válida também e às vezes eu a uso. Observe que, nesse caso, a maior parte do tempo é gasta no IO e, portanto, não há aumento perceptível no desempenho :) Outra diferença é que, uma vez no PATH, esse script também pode ser usado com outros scripts e aliases de shell; a função precisa ser carregada explicitamente
Iazel 27/01
1

Não alias "grep", melhor para alias "less", que nunca é usado por shells. Em sua .bashrcbasta colocar: alias less="less -r".

not2qubit
fonte
3
Não muito certo. É preciso usar ambos grep --color=always e less -R. Observe que o grep sabe apenas que está sendo canalizado para outro processo e a --color=autoopção usa somente essas informações para decidir se as cores serão exibidas ou não.
Brandizzi
3
Observe que a lessopção -ré diferente de -R. Provavelmente -Ré mais seguro.
Craig McQueen
1
Então, por que voto negativo na minha solução. O OP solicita especificamente lesscom o exemplo já usando a opção `--color '.
not2qubit
3
Um alias é provavelmente indesejável aqui. lesssuporta uma $LESSvariável de ambiente. Portanto, em vez de um alias, export LESS='-R'pode ser preferível.
greyfade
0

Eu preciso correr

grep --color=always -R "search string" * | less - r

com o sinalizador -r depois de menos , para que seja executado.

Pierre François
fonte
O que *faz? Na página de manual do grep: *: The preceding item will be matched zero or more times.Mas eu ainda não entendo ..!
Shayan 01/09