Como posso manter o destaque da correspondência do grep ao encontrar o grep?

Como posso manter o destaque da correspondência do grep ao encontrar o grep?

Se eu executar grep foo bar.txt, grep destaca cada ocorrência de "foo" em bar.txt. Mas às vezes eu quero usar findpara determinar quais arquivos o grep pesquisa. Então eu faço algo assim:

find . -iname "*.abc" | xargs grep foo

Ou isto:

find . -iname "*.abc" -exec grep foo {} \;

Em ambos os casos, o grep encontra corretamente ocorrências de "foo" nos arquivos especificados, mas a saída não tem nenhum destaque.

Como posso continuar usando findpara escolher arquivos para o grep pesquisar sem perder o destaque?

Estou executando o Gnome Terminal 3.4.1.1 no Ubuntu 12.04, com o bash como meu shell.

Responder1

Em ambos os comandos, o problema é que não, grepmas outro comando gera a saída real ( xargse find, respectivamente).

Você pode resolver isso chamando diretamente grepcada nome de arquivo:

IFS=$'\n'
for FILE in $(find . -iname "*.abc"); do
    grep foo $FILE
done
unset IFS

Ou como uma linha:

IFS=$'\n';for FILE in $(find . -iname "*.abc");do grep foo $FILE;done;unset IFS

Como funciona:

  • IFS=$'\n'define o separador de campo interno para o caractere de nova linha (ou espaços nos nomes dos arquivos causarão problemas).

  • for FILE in $(COMMAND); do COMMANDS donepercorre os arquivos especificados por COMMAND, define a variável FILEpara o arquivo atual e executa COMMANDS.

  • grep foo $FILEprocura fooem $FILEe envia os resultadosdiretamentepara a tela.

  • unset IFSdefine o separador de campo interno de volta ao seu valor padrão (não é necessário em um script).

Responder2

Apenas grepsua saída novamente para colori-la.

Fiz algo parecido aqui:Obtenha dados adicionais sobre a correspondência do grep

informação relacionada