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

Count total number of matches in directory with 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 几乎是即时的结果),所以我想坚持下去。

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

如果您不是要搜索大量文件,只需使用 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 }'

(如果没有 tac,请将 tac 替换为 tail -r

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

如果将这些内置到 ag 中以帮助促进这一点,那就更好了。我提交了一个 --stats-only 输出选项的拉取请求,这会有所帮助,但是还没有任何结果 如果你直接从 repo 构建,它是可用的,但不是但是在一个稳定的版本中,所以这应该会加速大量结果的过程。

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

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

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

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

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

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