どうもトミです。
特定の文字列が含まれるファイルを探したい時にどのようにしていますか?
例えばプログラミングをやっていてファイル群が膨大になった時に、あの変数はどこで定義しているんだっけ?このような時に便利な文字列検索ツールをご紹介します。
agとは何なのか
agはThe Silver Searcherと言って文字列検索ツールです。
カレントディレクトリ、または指定のディレクトリ配下に対象の文字列が含まれるファイルの検索に役立ちます。grepとか色々ありますが他のツールと比べるととにかく速いです。
agのインストール(Mac)
brew install the_silver_searcher
agの基本的な使い方
以下はターミナルでの実行例です。
対象文字列の検索
カレントディレクトリを回帰的に検索を行い、「ExePenalty」が含まれるファイル名、行(番号)が表示される
ag ExePenalty
出力例
Assets/Scripts/Interface/IPenalty.cs
3: void ExePenalty();// ペナルティを実行する
Assets/Scripts/Penalty/CountDownTimePenalty.cs
6: public override void ExePenalty()
Assets/Scripts/Penalty/BasePenalty.cs
7: public virtual void ExePenalty()
Assets/Scripts/Penalty/TotalPointPenalty.cs
6: public override void ExePenalty()
Assets/Scripts/MiniGame/MiniGame1.cs
59: penaltys.OrderBy(_ => Guid.NewGuid()).First().ExePenalty();
対象文字列が含まれるファイル名の一覧のみ表示したい
カレントディレクトリを回帰的に検索を行い、「ExePenalty」が含まれるファイル名のみ表示する
ag -l ExePenalty
出力例
Assets/Scripts/Interface/IPenalty.cs
Assets/Scripts/Penalty/CountDownTimePenalty.cs
Assets/Scripts/Penalty/BasePenalty.cs
Assets/Scripts/Penalty/TotalPointPenalty.cs
Assets/Scripts/MiniGame/MiniGame1.cs
対象文字列が含まれないファイル名の一覧を表示したい
対象文字列が含まないファイル名の一覧を出す時は ag -L 対象文字列 で検索すればいいです。
特定の拡張子だけを対象にしたい(パターン検索)
- ExePenalty
- aaa
- ExePenalty
- bbb
- ExePenalty
ag -G ‘\.txt$’ ExePenalty
出力例
Assets/Scripts/Penalty/Test.txt
1:ExePenalty
3:ExePenalty
5:ExePenalty
それ以外のオプション
これまでは基本的な使い方をご紹介させていただきました。それ以外にも沢山オプションがあります。必要に応じて使うといいでしょう。
対象文字列のヒット回数の表示
-c(小文字c)
コマンド例
ag -c ExePenalty
出力例
Assets/Scripts/Interface/IPenalty.cs:1
Assets/Scripts/Penalty/CountDownTimePenalty.cs:1
Assets/Scripts/Penalty/BasePenalty.cs:1
Assets/Scripts/Penalty/TotalPointPenalty.cs:1
Assets/Scripts/MiniGame/MiniGame1.cs:1
検索対象の前後の行も含めて表示したい
-C(大文字C)
コマンド例
ag -C ExePenalty
デフォルトは前後2行まで(前後5行を表示したい時は ag -C 5 対象文字列)
出力例
Assets/Scripts/Interface/IPenalty.cs
1-public interface IPenalty
2-{
3: void ExePenalty();// ペナルティを実行する
4-}
Assets/Scripts/Penalty/CountDownTimePenalty.cs
4-public sealed class CountDownTimePenalty : BasePenalty
5-{
6: public override void ExePenalty()
7– {
8– int countDownSec = GameManager.Instance.stageUiView.CountDownSec – 10;
Assets/Scripts/Penalty/BasePenalty.cs
5-public class BasePenalty : MonoBehaviour, IPenalty
6-{
7: public virtual void ExePenalty()
8– {
9–
Assets/Scripts/Penalty/TotalPointPenalty.cs
4-public sealed class TotalPointPenalty : BasePenalty
5-{
6: public override void ExePenalty()
7– {
8– int totalPoint = PlayerPrefsUtility.Load(GameConfig.TotalPoint, 0);
Assets/Scripts/MiniGame/MiniGame1.cs
57– );
58–
59: penaltys.OrderBy(_ => Guid.NewGuid()).First().ExePenalty();
60– }
61–
まとめ
今回は高速な文字列検索するツールag(The Silver Searcher)をご紹介させていただきました。是非試してみてください。
※ご紹介したオプションはほんの一部でしかないです。その他のオプションにもご興味があればag -helpでご確認ください。
- ag 対象文字列
- 対象文字列が含まれるファイル名及び行(番号)が表示される
- ag -l 対象文字列
- 対象文字列が含まれるファイル一覧が表示される
- ag -L 対象文字列
- 対象文字列が含まないファイル一覧が表示される
- ag -G パターン 対象文字列
- 対象パターンのファイルが表示される
- ag -c 対象文字列
- 対象文字列のヒット回数の表示
- ag -C 対象文字列
- 検索対象の前後の行も一緒に表示してくれる
コメント