Se eu executar grep foo bar.txt
, grep destaca cada ocorrência de "foo" em bar.txt
. Mas às vezes eu quero usar find
para 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 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.
Responder1
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
cada 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 done
percorre os arquivos especificados porCOMMAND
, define a variávelFILE
para o arquivo atual e executaCOMMANDS
.grep foo $FILE
procurafoo
em$FILE
e envia os resultadosdiretamentepara a tela.unset IFS
define o separador de campo interno de volta ao seu valor padrão (não é necessário em um script).
Responder2
Apenas grep
sua saída novamente para colori-la.
Fiz algo parecido aqui:Obtenha dados adicionais sobre a correspondência do grep