17

我试图在一个大型项目中查找给定字符串的匹配数。目前,要做到这一点,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 searchterm(好吧,几乎。在我的具体情况下,我也需要一个--ignore-dir building在那里),但由于这已经是一个大项目(并且将大大增长),提供的速度提升ag使它更可取(ack我的搜索大约需要 3 秒,而我的搜索ag结果几乎是即时的),所以我想坚持下去。

4

4 回答 4

20

我使用 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   
于 2016-02-09T16:54:17.210 回答
4

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

  • -o单独打印每个匹配项
  • --nofilename从输出中删除文件名
  • --nobreak删除不同文件中匹配项之间的换行符
于 2019-05-28T22:41:38.737 回答
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 -rtac

为了节省更多的输入,我为命令的后半部分设置了别名,这样我就可以通过管道ag --stats传递到我的别名并得到我想要的。所以,alias agmatches='tac | awk "NR==5 {print \$1}'我可以通过运行ag --stats searchterm | agmatches.

如果这些是内置于 ag 中的东西来帮助促进这一点,那仍然会好得多。我提交了一个--stats-only输出选项的拉取请求,这会有所帮助,但是如果您直接从存储库构建,但还没有稳定的版本,那么它还没有任何结果,所以这应该可以加快这个过程大量的结果。

于 2015-08-20T18:23:43.410 回答
2

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

ag --stats --java -c 'searchstring' | ag '.*匹配'

  • --java标志表示ag将只搜索带有.java(and .properties)扩展名的文件。因此,如果您在 python 项目中搜索.py文件,您将使用该--python标志。ag --list-file-types对所有可用于搜索的文件类型运行该命令。
  • -cor--count标志提供匹配的数量。
于 2021-05-25T13:56:05.757 回答