在目录中使用ag计算匹配的总数

21

我想要找到一个大型项目中给定字符串的匹配数量。目前,为了使用ag完成这个任务,我正在使用以下命令:

$ echo 0$(ag -c searchterm | sed -e "s/^.*:/+/") | bc

有一个明显有些冗长且不是很直观的方法,可以有更好的方式从ag中获取目录中匹配项的总数吗?我已经查阅了文档,但没有找到有帮助的信息。

编辑:由于对ag最近提交,文件名现在也可以使用ag而不是sed进行剥离,因此这个方法也可以:

$ echo `ag test -c --nofilename | sed "s/$/+/"`0 | bc

注意:我意识到可以使用ack -hcl搜索项来实现这一点(嗯,几乎是这样的。在我具体的情况下,我还需要一个--ignore-dir building),但由于这已经是一个大项目(而且将会大幅增长),所以ag提供的速度提升使其更可取(对于我的搜索,ack需要约3秒,而ag几乎瞬间返回结果),因此我想坚持使用它。


你有没有找到这个问题的答案? - jjaderberg
1
@jjaderberg 不完全是这样。最好的选择似乎是使用--stats选项,然后解析出正确的行。(例如,ag --stats searchterm | tail -n 5 | head -n 1)。我还提交了一个拉取请求,添加了一个--stats-only选项,可以防止打印任何其他内容,在这种情况下,ag --stats searchterm | head -n 1将获得匹配数。在这两种情况下,您仍需要过滤掉“ matches”以获取数字。 - SnoringFrog
4个回答

21

我使用 ag 本身来匹配统计信息。例如:

 >$ ag --stats --java -c 'searchstring' | ag '.*matches'
 >$ 22 matches 
 >$ 6 files contained matches

使用前瞻过滤器,仅打印匹配次数:

 >$ ag --stats --java -c 'searchstring' | ag -o '^[0-9]+(?=\smatches)'
 >$ 22   

3
对于现在发现这篇文章的人,--stats-only选项是在https://github.com/ggreer/the_silver_searcher/pull/733中添加的。 - dthor
虽然使用--stats-only会更好,但仍需要过滤掉冗长的评论(例如“搜索了xyz个字节”),以获取匹配项的原始数量;对于管道链和脚本,这通常是所需的。 - gregory
正确。但如果搜索字符串包含单词“matches”,则原始答案会失败。ag --stats-only 'searchstring' | ag '.*matches$'不会有这个问题(注意末尾的$)。 - dthor

5

ag -o --nofilename --nobreak 'searchstring' | wc -l

  • -o 参数单独打印每个匹配项
  • --nofilename 参数从输出中移除文件名
  • --nobreak 参数移除不同文件中匹配项之间的换行符

5

目前还没有很好的解决方案,但是针对其他人的需求,这是我至今想出的方法:

如果你不需要搜索大量文件,只需使用ack -hcl searchterm即可;否则...

通过利用--stats选项改进了我问题中的命令,将类似以下内容附加到搜索结果中:

714 matches
130 files contained matches
300 files searched
123968435 bytes searched
0.126203 seconds 

对于手动使用来说,这已经足够好了(尽管它仍然会在屏幕上显示所有匹配项),但对于脚本,我仍然需要只有数字。因此,为了达到这个目的,我已经从我的问题中的命令转移到了以下命令:

$ ag --stats searchterm | tail -n5 | head -n1 | cut -d" " -f1

或者更简洁但不那么易记的。
$ ag --stats searchterm | tac | awk 'NR==5 {print $1}'

(如果你没有 tac 命令,可以用 tail -r 替代 tac)

为了节省更多的输入,我将命令的后半部分取别名,这样我只需将 ag --stats 管道传递到我的别名中,就能得到我想要的结果。所以,通过运行 alias agmatches='tac | awk "NR==5 {print \$1}' 我可以通过运行 ag --stats searchterm | agmatches 来获取匹配项。

如果在 ag 中有一些内置功能来帮助实现这个目的,那会更好。我提交了一个拉取请求,增加了一种输出选项 --stats-only,但是还没有任何消息。如果您直接从存储库构建,则该选项可用,但尚未包含在稳定版本中,因此这应该能加速处理大量结果的过程。


3

我喜欢Gregory上面的回答,但是要添加更多的内容:

ag --stats --java -c 'searchstring' | ag '.*matches'

  • --java标志表示ag将仅搜索具有.java(和.properties扩展名的文件。因此,如果您在Python项目中搜索.py文件,则需要使用--python标志。运行ag --list-file-types命令以查看可用于搜索的所有文件类型。
  • -c--count标志提供匹配数

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接