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