2009-05-19 17 views
11

Trzeba przeszukiwać katalogi z dużą ilością podkatalogów na sznurku wewnątrz plików:Grep rekurencyjne i hrabia

Używam:

grep -c -r "string here" * 

Jak mogę całkowita liczba znalezisk?

Jak mogę wypisać do pliku tylko te pliki z co najmniej jedną instancją?

+0

Czy możesz podać więcej szczegółów, na przykład, co dokładnie nie działa? jaka jest pełna ścieżka do grep i do jakiej systme to uruchamiasz? – ennuikiller

+0

Czy możesz wyjaśnić, jakie dane wyjściowe widzisz i jak to, czego chcesz, różni się od tego, co otrzymujesz? – Suppressingfire

Odpowiedz

9

To działa dla mnie (pobiera całkowitą liczbę "napisów tutaj" znalezionych w każdym pliku). Jednak nie wyświetla sumy dla wszystkich przeszukiwanych plików. Oto, jak możesz to zrobić:

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

Lista będzie dostępna, a suma zostanie wysłana do STDOUT.

Oto wynik na drzewie katalogów 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 

Jeśli chcesz po prostu dostać się linie z wystąpień „string”, zmiana do tego:

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

które będą wyjście:

[... 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 

Możesz zmienić sposób drukowania plików (1 USD) i liczby na plik (2 USD).

+0

gdzie przypisujesz rozszerzenie tekstu? – Codex73

+0

Przepraszamy, to było z poprzedniej edycji. Rozszerzenia są tak blah :-) –

+0

jak mogę tylko wyprowadzać do plików, które mają ciąg. – Codex73

1

Chciałbym wypróbować połączenie find i grep.

find . | xargs grep -c "string here" 

W każdym razie, działa dla mnie (Mac OS X).

+0

ciąg jest bardzo duży, więc xargs nie działa – Codex73

+0

uważaj na spacje w nazwach plików. rozważ -print0 i -0 –

9

Korzystanie z podstawienia procesu Bash, daje to, co moim zdaniem jest wyjście, które chcesz? (Proszę wyjaśnić, na pytanie, czy nie jest.)

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

ten biegnie grep -r normalnie, z wyjściem będzie zarówno stdout i sposobu wc -l.

0

Aby wyjście tylko nazwy plików z meczów, należy:

grep -r -l "your string here" . 

Będzie wyjście jeden wiersz z nazwą pliku dla każdego pliku, który pasuje wyrażenie wyszukiwane.

2

Niektóre rozwiązania z AWK:

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

Następny nich jest całkowita liczba, liczba plików i liczba meczów dla każdego, wyświetlając pierwszy mecz z każdym z nich (aby wyświetlić wszystkie wyniki, należy zmienić warunek ++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]++' 

wyjścia dla pierwszego rozwiązania (wyszukiwanie w katalogu dla "boost::".I ręcznie wyciąć niektóre zbyt długie linie więc dopasować poziomo):

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 

wyjście do drugiego

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 

Kolory w rezultacie są ładne (--color=always do grep), ale łamią kiedy wyprowadzony przez awk tutaj. Więc lepiej nie włączaj ich wtedy, chyba że chcesz mieć cały terminal w kolorze później :) Pozdrawiam!

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

Działa jak urok.