Grep Рекурсивный и граф
Нужно искать каталоги с большим количеством подкаталогов для строки внутри файлов:
Я использую:
grep -c -r "string here" *
Как я могу подсчитать количество найденных фактов?
Как я могу вывести на файл только те файлы с хотя бы одним экземпляром?
Ответы
Ответ 1
Он работает для меня (он получает общее количество строк, найденных в каждом файле). Тем не менее, он не отображает общее количество файлов для ВСЕХ файлов. Вот как вы можете это получить:
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
Если вы просто хотите получить строки с вхождениями "string", измените на это:
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).
Ответ 2
Используя Bash замену процесса, это дает то, что я считаю результатом, который вы хотите? (Пожалуйста, уточните вопрос, если это не так.)
grep -r "string here" * | tee >(wc -l)
В этом режиме обычно выполняется grep -r
, при этом вывод идет как в stdout, так и в процесс wc -l
.
Ответ 3
Некоторое решение с 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. Так что лучше не включайте их тогда, если вы не захотите, чтобы весь ваш терминал был окрашен впоследствии:) Приветствия!
Ответ 4
Я бы попробовал сочетание find и grep.
find . | xargs grep -c "string here"
Во всяком случае, grep -c -r "string here" *
работает для меня (Mac OS X).
Ответ 5
grep -rc "my string" ./ | grep :[1-9] >> file_name_by_count.txt
Работает как шарм.
Ответ 6
Чтобы выводить только имена файлов со спичками, используйте:
grep -r -l "your string here" .
Он выведет одну строку с именем файла для каждого файла, который соответствует искомому выражению.