2009-05-19 3 views
11

нужен для поиска каталогов с большим количеством вложенных каталогов для строки внутри файлов:Grep Рекурсивный и граф

Я использую:

grep -c -r "string here" * 

Как общее количество находок?

Как я могу вывести в файл только те файлы с хотя бы одним экземпляром?

+0

Вы можете предоставить более подробную информацию о том, что именно не работает? каков полный путь к grep и какая система вы используете? – ennuikiller

+0

Можете ли вы уточнить, какой результат вы видите и как вы хотите, отличается от того, что вы получаете? – Suppressingfire

ответ

9

Он работает для меня (он получает общее количество строк, найденных в каждом файле). Тем не менее, он не отображает общее количество файлов для ВСЕХ файлов. Вот как вы можете получить его:

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

Список будет вне и общее будет отправлено на STDOUT.

Вот вывод на дереве каталогов 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 

Если вы просто хотите, чтобы строки с вхождений «строки», изменение к этому:

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

Это будет выход:

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

Вы можете изменить, как печатаются файлы ($ 1) и количество в файле ($ 2).

+0

где вы назначаете расширение текста? – Codex73

+0

Извините, это было из предыдущего редактирования. Расширения настолько blah :-) –

+0

как я могу выводить только файлы, у которых есть строка. – Codex73

1

Я бы попробовал сочетание find и grep.

find . | xargs grep -c "string here" 

Во всяком случае, grep -c -r "string here" * работает для меня (Mac OS X).

+0

строка очень большая, поэтому xargs не работает – Codex73

+0

Остерегайтесь пробелов в именах файлов. Рассмотрим -print0 и -0 –

9

Используя замену процесса Bash, это дает то, что я считаю результатом, который вы хотите? (Просьба уточнить вопрос, если это не так.)

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

Это работает grep -r нормально, с выходным происходит как на стандартный вывод и к wc -l процесса.

0

Для вывода только имена файлов со спичками, используйте:

grep -r -l "your string here" . 

Он будет выводить одну строки с именем файла для каждого файла, который соответствует выражению искало.

2

Некоторые решения с AWK:

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

Следующая одно общее количество, количество файлов, и число совпадений для каждого, показывая первый матч каждого (чтобы отобразить все матчи, изменить состояние на ++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]++' 

Выход для первого решения (поиск в каталоге для "boost::".Я вручную вырезать некоторые слишком длинные линии, чтобы они поместились горизонтально):

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 

выход для второго

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 

Цвета в результате хороши (--color=always для Grep), но они ломаются, когда поступает через awk здесь. Так что лучше не включайте их тогда, если вы не захотите, чтобы весь ваш терминал был окрашен потом :) Приветствия!

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

Работает как очарование.

Смежные вопросы