Como eu posso manter o jogo do grep destacando quando o piping encontra no grep?

4

Se eu executar grep foo bar.txt , grep destacará cada ocorrência de "foo" em bar.txt . Mas às vezes eu quero usar find para determinar quais arquivos são procurados pelo grep. 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 localiza corretamente ocorrências de "foo" nos arquivos especificados, mas a saída não tem nenhum destaque.

Como posso continuar usando find para 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.

    
por Matthew 25.05.2012 / 21:39

2 respostas

4

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

Você pode resolver isso chamando diretamente grep para cada nome de arquivo:

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

Ou como um verso:

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 como o caractere de nova linha (ou os espaços nos nomes de arquivo causarão problemas).

  • for FILE in $(COMMAND); do COMMANDS done faz um loop pelos arquivos especificados por COMMAND , define a variável FILE para o arquivo atual e executa COMMANDS .

  • grep foo $FILE pesquisa foo em $FILE e envia os resultados diretamente para a tela.

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

por 25.05.2012 / 22:05
3

Apenas grep de sua saída novamente para colorir.

Eu fiz algo semelhante aqui: Obtenha dados adicionais relacionados ao grep

    
por 25.05.2012 / 22:11