我试图在大型项目中找到给定字符串的匹配数。目前,要使用ag
执行此操作,我使用以下命令:
$ echo 0$(ag -c searchterm | sed -e "s/^.*:/+/") | bc
这显然有点冗长而且不太直观。有没有更好的方法来获取ag
目录中的匹配总数?我已经挖掘了文档,但在那里找不到任何有用的东西。
修改:感谢recent commit到ag
,文件名可以使用ag
而不是sed
来删除,所以这也有效:
$ echo `ag test -c --nofilename | sed "s/$/+/"`0 | bc
注意:我意识到我可以用ack -hcl searchterm
做到这一点(好吧,差不多。在我的具体情况下我也需要一个--ignore-dir building
),但因为这已经是一个大项目了(而且会有相当大的增长),ag
提供的速度提升更可取(ack
我的搜索需要大约3秒,而ag
几乎是瞬时的结果,所以我会喜欢坚持下去。
答案 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
(和 .properties
)extensions 的文件。因此,如果您在 Python 项目中搜索 .py
文件,您将使用 --python
标志。对所有可用于搜索的文件类型运行 ag --list-file-types
命令。-c
或 --count
标志提供 number of matches。