使用 ag 计算目录中的匹配总数
Count total number of matches in directory with ag
我正在尝试查找大型项目中给定字符串的匹配项数。目前,要使用 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
几乎是即时的结果),所以我想坚持下去。
仍然没有很好的解决方案,但这是迄今为止我为发现此问题的其他人设法提出的解决方案:
如果您不是要搜索大量文件,只需使用 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
(和 .properties
)extensions 的文件。因此,如果您在 python 项目中搜索 .py
文件,您将使用 --python
标志。 运行 ag --list-file-types
命令可搜索所有可用的文件类型。
-c
或 --count
标志提供 number of matches。
我正在尝试查找大型项目中给定字符串的匹配项数。目前,要使用 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
几乎是即时的结果),所以我想坚持下去。
仍然没有很好的解决方案,但这是迄今为止我为发现此问题的其他人设法提出的解决方案:
如果您不是要搜索大量文件,只需使用 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
(和.properties
)extensions 的文件。因此,如果您在 python 项目中搜索.py
文件,您将使用--python
标志。 运行ag --list-file-types
命令可搜索所有可用的文件类型。-c
或--count
标志提供 number of matches。