17

大規模なプロジェクト全体で、特定の文字列の一致数を見つけようとしています。現在、これを行うagには、次のコマンドを使用しています。

$ echo 0$(ag -c searchterm | sed -e "s/^.*:/+/") | bc

これは明らかに少し長く、あまり直感的ではありません。からディレクトリ内の一致の総数を取得するより良い方法はありますagか? 私はドキュメントを掘り下げましたが、そこに役立つものは何も見つかりませんでした。

編集:への最近のコミットのおかげで、ファイル名はの代わりにag削除できるため、これも機能します:agsed

$ 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 に答える
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 に答える