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)
仍然没有很好的解决方案,但这是我迄今为止为发现此问题的其他人想出的解决方案:
如果您不搜索大量文件,只需使用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删除不同文件中匹配项之间的换行符