2013-04-21 34 views
7

我试图做一个递归的grep搜索,例如:递归grep来只显示总配套配件算

grep -r -c "foo" /some/directory 

这给我输出奥赫为:

/some/directory/somefile_2013-04-08.txt:0 
/some/directory/somefile_2013-04-09.txt:1 
/some/directory/somefile_2013-04-10.txt:4 
...etc 
然而

,我想以获得所有文件中的匹配总数,如:

Total matches: 5 

我玩过其他一些例子,如in this thread,虽然我似乎无法做到这么简单。

回答

17
grep -ro "foo" /some/directory | wc -l | xargs echo "Total matches :" 

grep打印所有-o选项文件中字符串的现有出现次数。

+0

谢谢,有用的命令。我不确定哪个是准确的,因为以你的榜样为例,我得到了447场比赛,而约翰斯得到了392场比赛。我将不得不多花一点时间来了解我的猜测。 – 2013-04-21 00:56:13

+0

反正这个命令对我完全有效。我已经更新了我的示例以添加一个字符串,以便在命令结束时提供结果。 – 2013-04-21 01:01:27

+1

单个行中的多个匹配每个都会用'-o'生成一个单独的输出行。 – chepner 2013-04-21 02:28:37

3
matches=$(grep -rch "foo" /some/directory | paste -sd+ - | bc) 
echo "Total matches: $matches" 

paste/bc块总结了一个数字列表。请参阅:Bash command to sum a column of numbers

+0

哇。真棒命令:) - 很难添加“总匹配:”它? – 2013-04-21 00:49:58

+0

我最终与哈利姆斯一起去了,因为它把所有东西都合并在一行中。我一定会保留这个方便的,因为它可能非常有用。 ty再次。 – 2013-04-21 02:56:14

1

如果你只需要总,你可以跳过获取计数的每个文件,以及刚刚获得匹配的线的总数:

grep -r "foo" /some/directory | wc -l 
+0

这将只打印找到一个或多个事件的每一行。这不会返回所有现有的字符串或模式的出现。 – 2013-04-21 00:52:06

+0

你是对的。 – btanaka 2013-04-21 00:53:54

4

只需管道grep。

grep -r "foo" /some/directory | grep -c "foo"