String Search: encontre e grep e?

1

Tarefa:
1) encontrar uma string 'decor' dentro de arquivos em um diretório
2) obter o número de ocorrência para a decoração de cada arquivo que tenha

A primeira parte do problema é parcialmente resolvida com find . -type f | grep -i decor *
Mas isso não parece grep para todos os arquivos que são encontrados a partir de find , mas sim o que está no topo do diretório atual.
Eu tenho que usar algo diferente de * para grep para grep para arquivos encontrados no find?

o que precisa ser canalizado para que seja exibido com um nome de arquivo e o número de ocorrências para a decoração de cada arquivo?

    
por ealeon 14.01.2014 / 15:09

4 respostas

2

Você pode fazer:

find . -type f -exec grep -icH decor {} \; | grep -v :0\$

Isto irá obter o nome do arquivo e a contagem de cada partida e removerá arquivos com uma contagem de 0 usando o egrep canalizado

    
por 14.01.2014 / 15:22
2

"Arquivos em um diretório" geralmente não significa "subdiretórios iside e recursivamente". Eu usaria apenas

grep -c decor *

Se você precisar procurar subdiretórios, também, você pode usar find, mas conecte os comandos de forma diferente: pipe apenas conecta a saída do primeiro comando à entrada do segundo. O Grep não espera uma lista de arquivos em sua entrada, no entanto.

find . -type f -exec grep -cH decor {} + | grep -v :0
    
por 14.01.2014 / 15:21
0

Você pode usar a opção -exec. find . -type f -exec grep decor {} \;

ou use xargs find . -type f | xargs -i grep decor {}

    
por 14.01.2014 / 15:21
0

TMTOWTDI - Eu gosto de ver as outras variantes, então aqui está a minha também:

$ find . -type f -exec egrep -li decor {} \;

$ perl -e '$c=0; while(<>){$c++ if /decor/;} continue {if(eof){print("$ARGV:$c\n"); close ARGV; $c=0;} }' *

Só porque eu senti vontade de reescrever um Perl 1-liner que faz o mesmo que um antigo awk exemplo tirado das páginas de Kernighan e Pike .

    
por 14.01.2014 / 22:05