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

时间:2015-08-13 18:28:36

标签: full-text-search ag

我试图在大型项目中找到给定字符串的匹配数。目前,要使用ag执行此操作,我使用以下命令:

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

这显然有点冗长而且不太直观。有没有更好的方法来获取ag目录中的匹配总数?我已经挖掘了文档,但在那里找不到任何有用的东西。

修改:感谢recent commitag,文件名可以使用ag而不是sed来删除,所以这也有效:

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

注意:我意识到我可以用ack -hcl searchterm做到这一点(好吧,差不多。在我的具体情况下我也需要一个--ignore-dir building),但因为这已经是一个大项目了(而且会有相当大的增长),ag提供的速度提升更可取(ack我的搜索需要大约3秒,而ag几乎是瞬时的结果,所以我会喜欢坚持下去。

4 个答案:

答案 0 :(得分:11)

我使用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   

答案 1 :(得分:3)

仍然没有很好的解决方案,但是我已经设法为其他任何发现这一点的人提出了解决方案:

如果您没有搜索大量文件,请使用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输出选项的拉取请求,该选项可以提供帮助,但是没有任何内容,如果你直接从repo构建但是还没有稳定释放,因此应该加快过程的大量结果的花絮。

答案 2 :(得分:1)

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

  • -o分别打印每个匹配项
  • --nofilename从输出中删除文件名
  • --nobreak删除不同文件中的匹配项之间的换行符

答案 3 :(得分:1)

我喜欢上面 gregory 的回答,但要添加更多上下文:

<块引用>

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

  • --java 标志表示 ag 将只搜索带有 .java(和 .propertiesextensions 的文件。因此,如果您在 Python 项目中搜索 .py 文件,您将使用 --python 标志。对所有可用于搜索的文件类型运行 ag --list-file-types 命令。
  • -c--count 标志提供 number of matches