Grep recursivo e Conde

votos
11

Necessidade de uma pesquisa de diretórios com muitos sub-diretórios para uma string dentro de arquivos:

Estou a usar:

grep -c -r string here *

Como posso contagem total de achados?

Como posso saída para o arquivo apenas os arquivos com pelo menos um exemplo?

Publicado 19/05/2009 em 20:26
fonte usuário
Em outras línguas...                            


6 respostas

votos
9

Ele funciona para mim (ele recebe o número total de 'string aqui' encontrado em cada arquivo). No entanto, ele não exibir o total para todos os arquivos pesquisados. Aqui está como você pode obtê-lo:

grep -c -r 'string' file > out && \
    awk -F : '{total += $2} END { print "Total:", total }' out

A lista estará em fora eo total será enviado para STDOUT.

Aqui está a saída na árvore de diretórios Python2.5.4:

grep -c -r 'import' Python-2.5.4/ > out && \
    awk -F : '{total += $2} END { print "Total:", total }' out
Total: 11500

$ head out
Python-2.5.4/Python/import.c:155
Python-2.5.4/Python/thread.o:0
Python-2.5.4/Python/pyarena.c:0
Python-2.5.4/Python/getargs.c:0
Python-2.5.4/Python/thread_solaris.h:0
Python-2.5.4/Python/dup2.c:0
Python-2.5.4/Python/getplatform.c:0
Python-2.5.4/Python/frozenmain.c:0
Python-2.5.4/Python/pyfpe.c:0
Python-2.5.4/Python/getmtime.c:0

Se você quiser apenas para obter linhas com ocorrências de 'string', mude para o seguinte:

grep -c -r 'import' Python-2.5.4/ | \
    awk -F : '{total += $2; print $1, $2} END { print "Total:", total }'

Que o produto será:

[... snipped]
Python-2.5.4/Lib/dis.py 4
Python-2.5.4/Lib/mhlib.py 10
Python-2.5.4/Lib/decimal.py 8
Python-2.5.4/Lib/new.py 6
Python-2.5.4/Lib/stringold.py 3
Total: 11500

Você pode mudar a forma como os arquivos ($ 1) e a contagem por arquivo (US $ 2) é impresso.

Respondeu 19/05/2009 em 20:40
fonte usuário

votos
9

Usando substituição processo de Bash, isso dá o que eu acredito é a saída que você quer? (Por favor, esclareça a questão se não é.)

grep -r "string here" * | tee >(wc -l)

Isto funciona grep -rnormalmente, com saída indo tanto para stdout e um wc -lprocesso.

Respondeu 19/05/2009 em 20:36
fonte usuário

votos
2

Alguma solução com AWK:

grep -r "string here" * | awk 'END { print NR } 1'

Próximo é contagem total, número de arquivos, eo número de partidas para cada um, exibindo a primeira partida de cada um (para exibir todos os jogos, alterar a condição de ++f[$1]):

grep -r "string here" * | 
    awk -F: 'END { print "\nmatches: ", NR, "files: ", length(f); 
                   for (i in f) print i, f[i] } !f[$1]++'

Saída para a primeira solução (busca dentro de um diretório para boost::"" Eu cortei manualmente algumas linhas muito tempo para que eles se encaixam na horizontal):

list_inserter.hpp:            return range( boost::begin(r), boost::end(r) );
list_of.hpp:            ::boost::is_array<T>,
list_of.hpp:            ::boost::decay<const T>,
list_of.hpp:            ::boost::decay<T> >::type type;
list_of.hpp:        return ::boost::iterator_range_detail::equal( l, r );
list_of.hpp:        return ::boost::iterator_range_detail::less_than( l, r );
list_of.hpp:        return ::boost::iterator_range_detail::less_than( l, r );
list_of.hpp:        return Os << ::boost::make_iterator_range( r.begin(), r.end() );
list_of.hpp:            return range( boost::begin(r), boost::end(r) );
list_of.hpp:            return range( boost::begin(r), boost::end(r) );
list_of.hpp:            return range( boost::begin(r), boost::end(r) );
ptr_list_of.hpp:                          BOOST_DEDUCED_TYPENAME boost::ptr_...
ptr_list_of.hpp:        typedef boost::ptr_vector<T>       impl_type;
13

Saída para o segundo

list_inserter.hpp:            return range( boost::begin(r), boost::end(r) );
list_of.hpp:            ::boost::is_array<T>,
ptr_list_of.hpp:                          BOOST_DEDUCED_TYPENAME boost::ptr_...

matches:  13 files:  3
ptr_list_of.hpp 2
list_of.hpp 10
list_inserter.hpp 1

Cores no resultado são bons ( --color=alwayspara grep), mas eles quebram quando canalizada através de awk aqui. Então é melhor não permitir que eles, em seguida, a menos que você quer ter todo o seu terminal de cor depois :) Felicidades!

Respondeu 19/05/2009 em 20:53
fonte usuário

votos
1
grep -rc "my string" ./ | grep :[1-9] >> file_name_by_count.txt

Funciona como um encanto.

Respondeu 01/08/2010 em 23:53
fonte usuário

votos
1

Gostaria de tentar uma combinação de achado e grep.

find . | xargs grep -c "string here"

De qualquer forma, grep -c -r "string here" *funciona para mim (Mac OS X).

Respondeu 19/05/2009 em 20:36
fonte usuário

votos
0

Para a saída de arquivo somente nomes com jogos, use:

grep -r -l "your string here" .

Ele irá imprimir uma linha com o nome do arquivo para cada arquivo que corresponde à expressão procurou.

Respondeu 19/05/2009 em 20:49
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more