Como posso destacar correspondências usando o GNU grep?


18

Eu já vi em alguns Linux, que grepestá configurado para destacar a correspondência e imprimir o arquivo correspondente.

Como posso configurar greppara destacar correspondências?

Respostas:


10
alias cgrep='grep -nR --color'

Uso:

$ cgrep somestring /path/to/dir/or/file/with*/possible/*wild.card

Também um dos meus favoritos:

$ pgrep some-hanging-process

listará todos os pids de processos que correspondem ao nome de algum processo pendente que você pode usar na seguinte situação:

$ kill $(pgrep some-hanging-process)

12
existe o comando pkill para o último
diega 10/10

11
Nas versões recentes do GNU grep, grep -rgeralmente deve ser preferida, grep -Rpois a primeira não atravessa links simbólicos.
Stéphane Chazelas

19

Eu descobri que a melhor maneira de pimp grep é usar ack , que é essencialmente grep recursivo com uma lista de ignorados inteligente (por exemplo, não pesquisa diretórios .svn, ignora arquivos de backup, etc.), destaque de cores dos resultados e regexps perl. É o que você deseja que o grep faça 98,6% do tempo.


5
+1 por mencionar confirmação. Não se esqueça de incluir a opção --pager = "less -R" para manter o realce de manutenção para resultados paginados. Também vale a pena mencionar que, no Ubuntu, é chamado de "ack-grep", já que "ack" é usado.
Shawn Chin

Eu uso ack, bem como, mas em algum momento você não tê-lo disponível ..
Elmarco

2
Como o ack é apenas um script perl, você pode disponibilizá-lo em qualquer lugar em que o perl esteja instalado, o que não é muito alto.
Kai

O ack é bom por seus padrões prontos para uso, mas no tempo necessário para instalar o ack, você pode ter configurado alguns padrões para o grep - veja minha resposta em outro lugar nesta página. Eu fiz isso uma vez na década de 1980 e, desde então, o grep fez tudo que o ack faz. (somente grep é realmente mais rápido, apesar das reivindicações altos de ACK para o contrário)
Jonathan Hartley

7

Eu configurei isso no meu .bashrc, em vez de redefinir o grep usando um alias:

    export GREP_OPTIONS="--color=auto"

Para mim, isso funciona no Linux, MacOSX e FreeBSD.


GREP_OPTIONSdeve ser considerado prejudicial. Eu recomendo usar em seu aliaslugar. Veja aqui: bugs.launchpad.net/ubuntu/+bug/67141
lesmana:

Concordo que GREP_OPTIONS pode ser um problema em certos scripts. Mas, como argumentei no bug 67141 , o GREP_OPTIONS permite que o usuário defina uma opção para muitas formas de grep (grep, egrep, fgrep, rgrep, zgrep, bzgrep, bzfgrep, bzegrep, etc.), enquanto um alias precisará ser definido para todas as formas de * grep, e existem muitos tipos de grep.
Stefan Lasiewski

Eu costumava usar GREP_OPTIONS por anos (não, décadas), mas o dano que ele causa é muito real. Quaisquer ferramentas que invoquem grep com este conjunto de variáveis ​​de ambiente herdarão seu comportamento padrão modificado e isso quebrará essas ferramentas. Evite esse problema completamente, definindo um alias ou um script de wrapper executável.
Jonathan Hartley

Os scripts devem higienizar seu ambiente. Não são permitidos ifs, buts ou howevers. Período. (Sim, é uma dor real na região lombar ...).
vonbrand

3

Eu recomendo evitar a variável de ambiente GREP_OPTIONS, ela afetará todas as chamadas do grep, mesmo aquelas incorporadas em outras ferramentas. Se essas ferramentas esperam que o grep se comporte de uma maneira, e você altera esse comportamento, ele quebrará essas ferramentas.

Em vez disso, você pode criar um alias, que funciona bem. Isso afetará apenas as chamadas para grep do seu shell interativo (ou seja, você digita você mesmo).

A opção final, que eu mais gosto, é criar um script de wrapper que invoque grep. Prefiro isso a um alias, porque posso chamar esse wrapper de outros programas. Por exemplo, no vim, definindo vimgrep, para que minhas pesquisas no vim se comportem de forma idêntica às pesquisas na linha de comando.

$ cat `which grp`
#!/usr/bin/env bash
grep -rI --color --exclude-dir=\.bzr --exclude-dir=\.git --exclude-dir=\.hg --exclude-dir=\.svn --exclude-dir=build --exclude-dir=dist --exclude=tags $*

Invoque isso usando:

$ grp pattern dir

por exemplo

$ grp pattern .

procurará por instâncias de 'padrão' em todos os arquivos de texto no diretório e subdiretórios atual.

Observe que eu chamo meu script de 'grp', em vez de sombrear 'grep', para que eu esteja sempre ciente de estar invocando grep com meus padrões personalizados ou não.

Por padrão, incluo:

-r : search subdirs recursive
-I : skip binary files
--color : highlight matches in color
--exclude-dir : skip specified directories and their subdirs
--exclude : skip specified files

Eu acho que todo mundo gostaria de pular dirs de controle de origem: .hg .git .bzr .svn

Ignorar 'build' e 'dist' são ismos de Python e provavelmente não se aplica à maioria das pessoas. Sem dúvida, você desenvolverá suas próprias idiossincrasias enquanto trabalha.

'tags' é a saída de ctags, que eu uso para 'go to function definition' e similares em ferramentas como vim. Como ele contém pelo menos uma cópia de cada palavra e símbolo do meu código-fonte, vale a pena pular dos resultados da pesquisa.

"$ *" no final é a sintaxe do bash para "e todos os outros parâmetros da linha de comando", para que você possa passar o padrão e o diretório para pesquisar normalmente e substituir quaisquer outros sinalizadores da linha de comando que desejar .


2

A --coloropção já foi mencionada várias vezes, mas eu gostaria de acrescentar que é possível configurar a cor na qual as correspondências serão destacadas usando uma variável de ambiente

export GREP_COLOR="1;33"

A cor deve ser codificada usando códigos de cores ANSI, para referência

Black       0;30     Dark Gray     1;30
Blue        0;34     Light Blue    1;34
Green       0;32     Light Green   1;32
Cyan        0;36     Light Cyan    1;36
Red         0;31     Light Red     1;31
Purple      0;35     Light Purple  1;35
Brown       0;33     Yellow        1;33
Light Gray  0;37     White         1;37

11
GREP_COLORestá obsoleto. Use em GREP_COLORSvez disso.
precisa saber é o seguinte

2

Como eu não vi nenhum exemplo de como definir cores, aqui está uma configuração simples para o GNU grep:

# turn on colors, natch.
export GREP_OPTIONS="--color=auto"

if [[ $(echotc Co) -ge 256 ]]; then
  # 256 color terminals
  export GREP_COLORS="mt=38;5;118:sl=:cx=:fn=38;5;18:ln=1;30:bn=37:se=30"
else
  # everybody else
  export GREP_COLORS="mt=31:sl=:cx=:fn=34:ln=1;30:bn=30:se=30"
fi

Tenha cuidado com GREP_OPTIONS; não o use para nada além de coisas como --color=autoisso, pois isso atrapalhará os scripts que usam grep no seu sistema.

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.