Greprecursion和计数

需要在文件内search一个包含大量子目录的string:

我在用着:

grep -c -r "string here" * 

我怎样才能总计发现?

我怎样才能输出文件只有至less有一个实例的文件?

Solutions Collecting From Web of "Greprecursion和计数"

它适用于我(它获得在每个文件中找到'字符串的总数')。 但是,它不显示搜索的所有文件的总数。 这里是你如何得到它:

 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)的打印方式。

使用Bash的过程替换,这给我相信是你想要的输出? (请澄清问题,如果不是。)

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

这通常运行grep -r ,同时输出到stdout和wc -l进程。

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在这里传送时会中断。 所以最好不要启用它们,除非你想让所有的终端彩色之后:)干杯!

我会尝试find和grep的组合。

 find . | xargs grep -c "string here" 

无论如何, grep -c -r "string here" *适用于我(Mac OS X)。

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

奇迹般有效。

要仅输出匹配的文件名,请使用:

 grep -r -l "your string here" . 

它将输出一行文件名与每个匹配搜索表达式的文件。