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.



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


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á


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)


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


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.


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