【问题标题】:Count total number of matches in directory with ag用 ag 计算目录中的匹配总数
【发布时间】:2015-11-06 20:51:30
【问题描述】:

我正在尝试在一个大型项目中查找给定字符串的匹配数。目前,要使用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 几乎是即时的结果),所以我想坚持下去。

【问题讨论】:

  • 你找到这个问题的答案了吗?
  • @jjaderberg 不完全是。最好的选择似乎是 --stats 选项,然后解析出正确的行。 (例如,ag --stats searchterm | tail -n 5 | head -n 1)。我还提交了一个 --stats-only 选项的拉取请求,该选项可以防止打印任何其他内容,在这种情况下,ag --stats searchterm | head -n 1 将获得匹配的数量。在这两种情况下,您仍然需要过滤掉“匹配项”才能获得数字。

标签: full-text-search ag


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    仍然没有很好的解决方案,但到目前为止,我已经设法为其他发现此问题的人提出了以下建议:

    如果您不搜索大量文件,只需使用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,请将tac 替换为tail -r

    为了节省更多的输入,我为命令的后半部分设置了别名,这样我就可以将ag --stats 传递给我的别名并得到我想要的。因此,使用alias agmatches='tac | awk "NR==5 {print \$1}',我可以通过运行ag --stats searchterm | agmatches 来获得匹配项。

    如果这些是内置于 ag 中的东西来帮助实现这一点,那就更好了。我提交了一个--stats-only 输出选项的拉取请求,该选项会有所帮助,但目前还没有任何结果,如果您直接从存储库构建,但还没有稳定版本,则可以使用该选项,所以这应该会加快处理大量结果的花絮。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-20
          • 2012-06-09
          • 2018-04-13
          • 1970-01-01
          • 2016-09-04
          相关资源
          最近更新 更多