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

Sno*_*rog 12 full-text-search ag

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

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

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

编辑:多亏了最近提交ag,文件名可以被剥离ag,而不是sed,所以这也可以工作:

$ echo `ag test -c --nofilename | sed "s/$/+/"`0 | bc
Run Code Online (Sandbox Code Playgroud)

注意:我意识到我可以做到这一点ack -hcl searchterm(嗯,几乎.在我的具体情况下我也需要一个--ignore-dir building在那里),但由于这已经是一个大型项目(并将大幅增长),提供的速度提升ag使它更好(ack我的搜索需要大约3秒钟,而且ag几乎是瞬间的结果),所以我想坚持下去.

gre*_*ory 13

我使用ag本身来匹配统计数据.例如:

 >$ ag --stats --java -c 'searchstring' | ag '.*matches'
 >$ 22 matches 
 >$ 6 files contained matches
Run Code Online (Sandbox Code Playgroud)

使用先行过滤只打印匹配数量:

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

  • 对于那些现在发现这一点的人,在 https://github.com/ggreer/the_silver_searcher/pull/733 中添加了 `--stats-only` 选项 (3认同)

Sno*_*rog 5

仍然没有很好的解决方案,但这是我迄今为止为发现此问题的其他人想出的解决方案:

如果您不搜索大量文件,只需使用ack -hcl searchterm,否则......

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

714 matches
130 files contained matches
300 files searched
123968435 bytes searched
0.126203 seconds 
Run Code Online (Sandbox Code Playgroud)

对于手动使用,这已经足够了(尽管它仍然充斥着所有匹配的屏幕),但对于脚本,我仍然只需要数字。因此,为此,我将问题中的命令改为:

$ ag --stats searchterm | tail -n5 | head -n1 | cut -d" " -f1
Run Code Online (Sandbox Code Playgroud)

或者更简洁但不太令人难忘的

$ ag --stats searchterm | tac | awk 'NR==5 {print $1}'
Run Code Online (Sandbox Code Playgroud)

(如果没有则替换tac为)tail -rtac

为了节省更多的打字时间,我为命令的后半部分设置了别名,这样我就可以通过管道传输ag --stats到我的别名并获得我想要的内容。因此,alias agmatches='tac | awk "NR==5 {print \$1}'我可以通过运行来获得匹配项ag --stats searchterm | agmatches

如果这些是农业中内置的东西来帮助促进这一点,那就更好了。我提交了一个--stats-only输出选项的拉取请求,这将有所帮助,如果您直接从存储库构建,则还没有任何结果可用,但尚未处于稳定版本中,因此这应该会加快该过程对于大量结果。


小智 5

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

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