0
1

【Grep】ripgrep / git grep を使用した文字列検索

Last updated at Posted at 2024-04-17

はじめに

影響範囲調査時などで活躍するため、備忘録として記載しています。
同じように調査を行われる方にも、この記事が参考になれば幸いです。

Todo

Git管理されているリポジトリにおいて、対象の文字列が使われているファイルのパス・内容を出力する

検索ワード例

例)AccessTokenモデルが使用されていそうなワードを予測

  • AccessToken
  • access_token
  • at.

出力したい内容

  • ファイルパス
  • 特定のワードが使用されている行の内容
    • 行番号の表示も行う
  • 下記ファイルは検索対象から除外したい
    • ***_spec.rb
    • schema.rb

ripgrep

事前にインストールしておく

brew install ripgrep

テンプレート

テンプレ1
rg '検索ワード1|検索ワード2' -g '!検索から除外したいファイル名' -n --sort-files
テンプレ2(ファイルパスがメイン)
rg '検索ワード1|検索ワード2' -g '!検索から除外したいファイル名' -c --sort path

ファイルパス・行番号・その行の内容を表示するパターン

コマンド例1
rg 'AccessToken|access_token|at\.' -g '!*spec.rb' -g '!schema.rb' -n --sort-files
出力結果1
app/controllers/books_search_controller.rb
14:    return redirect_to root_path unless current_user&.has_valid_access_token?

app/controllers/homes_controller.rb
7:      if current_user&.has_valid_access_token?

app/controllers/sessions_controller.rb
15:      save_access_token(user, auth_hash) unless user.has_valid_access_token?
38:  def save_access_token(user, auth_hash)
39:    access_token = auth_hash['credentials']['token']
40:    AccessToken.create_access_token_for_user!(user, access_token)

app/models/access_token.rb
1:class AccessToken < ApplicationRecord
9:    def create_access_token_for_user!(user, token)

app/models/user.rb
2:  has_many :access_tokens
11:  def has_valid_access_token?
12:    access_tokens.where('expires_at > ?', Time.zone.now).exists?

app/services/chat_gpt_service.rb
15:    @client = OpenAI::Client.new(access_token: ENV.fetch("OPENAI_ACCESS_TOKEN"))

app/views/books_search/index.html.erb
23:    const hasValidAccessToken = '<%= current_user&.has_valid_access_token? %>';
28:    if (!hasValidAccessToken) {

config/initializers/openai.rb
2:  config.access_token = ENV.fetch("OPENAI_ACCESS_TOKEN")

db/migrate/20240220141834_create_access_tokens.rb
1:class CreateAccessTokens < ActiveRecord::Migration[7.0]
3:    create_table :access_tokens do |t|

test/models/access_token_test.rb
3:class AccessTokenTest < ActiveSupport::TestCase

ファイルパス、および検索ワードの出現回数を表示するパターン

コマンド例2
rg 'AccessToken|access_token|at\.' -g '!*spec.rb' -g '!schema.rb' -c --sort path
出力結果2
app/controllers/books_search_controller.rb:1
app/controllers/homes_controller.rb:1
app/controllers/sessions_controller.rb:4
app/models/access_token.rb:2
app/models/user.rb:3
app/services/chat_gpt_service.rb:1
app/views/books_search/index.html.erb:2
config/initializers/openai.rb:1
db/migrate/20240220141834_create_access_tokens.rb:2
test/models/access_token_test.rb:1

git grepの場合

テンプレート

テンプレ1
git grep -e 検索ワード1 -e 検索ワード2 -n ':!検索から除外したいファイル名'
テンプレ2(ファイルパスがメイン)
git grep -e 検索ワード1 -e 検索ワード2 --count ':!検索から除外したいファイル名'

ファイルパス・行番号・その行の内容を表示するパターン

コマンド例1
git grep -e AccessToken -e access_token -e 'at\.' -n ':!*spec.rb' ':!*schema.rb'
出力結果1
app/controllers/books_search_controller.rb:14:    return redirect_to root_path unless current_user&.has_valid_access_token?
app/controllers/homes_controller.rb:7:      if current_user&.has_valid_access_token?
app/controllers/sessions_controller.rb:15:      save_access_token(user, auth_hash) unless user.has_valid_access_token?
app/controllers/sessions_controller.rb:38:  def save_access_token(user, auth_hash)
app/controllers/sessions_controller.rb:39:    access_token = auth_hash['credentials']['token']
app/controllers/sessions_controller.rb:40:    AccessToken.create_access_token_for_user!(user, access_token)
app/models/access_token.rb:1:class AccessToken < ApplicationRecord
app/models/access_token.rb:9:    def create_access_token_for_user!(user, token)
app/models/user.rb:2:  has_many :access_tokens
app/models/user.rb:11:  def has_valid_access_token?
app/models/user.rb:12:    access_tokens.where('expires_at > ?', Time.zone.now).exists?
app/services/chat_gpt_service.rb:15:    @client = OpenAI::Client.new(access_token: ENV.fetch("OPENAI_ACCESS_TOKEN"))
app/views/books_search/index.html.erb:23:    const hasValidAccessToken = '<%= current_user&.has_valid_access_token? %>';
app/views/books_search/index.html.erb:28:    if (!hasValidAccessToken) {
config/initializers/openai.rb:2:  config.access_token = ENV.fetch("OPENAI_ACCESS_TOKEN")
db/migrate/20240220141834_create_access_tokens.rb:1:class CreateAccessTokens < ActiveRecord::Migration[7.0]
db/migrate/20240220141834_create_access_tokens.rb:3:    create_table :access_tokens do |t|
test/models/access_token_test.rb:3:class AccessTokenTest < ActiveSupport::TestCase

ファイルパス、および検索ワードの出現回数を表示するパターン

コマンド例2
git grep -e AccessToken -e access_token -e 'at\.' --count ':!*spec.rb' ':!*schema.rb'
出力結果2
app/controllers/books_search_controller.rb:1
app/controllers/homes_controller.rb:1
app/controllers/sessions_controller.rb:4
app/models/access_token.rb:2
app/models/user.rb:3
app/services/chat_gpt_service.rb:1
app/views/books_search/index.html.erb:2
config/initializers/openai.rb:1
db/migrate/20240220141834_create_access_tokens.rb:2
test/models/access_token_test.rb:1

実行結果をファイルに出力したい場合

上記いずれかのコマンド > ~/Desktop/result.txt

コマンドの末尾に、> ~/Desktop/result.txtを追記するだけ。

コマンド実行後、Desktopにresult.txtが作成され、内容も出力される。

ripgrep

コマンド例
rg 'AccessToken|access_token|at\.' -g '!*spec.rb' -g '!schema.rb' -n --sort-files > ~/Desktop/result.txt
result.rb
app/controllers/books_search_controller.rb:14:    return redirect_to root_path unless current_user&.has_valid_access_token?
app/controllers/homes_controller.rb:7:      if current_user&.has_valid_access_token?
app/controllers/sessions_controller.rb:15:      save_access_token(user, auth_hash) unless user.has_valid_access_token?
app/controllers/sessions_controller.rb:38:  def save_access_token(user, auth_hash)
app/controllers/sessions_controller.rb:39:    access_token = auth_hash['credentials']['token']
app/controllers/sessions_controller.rb:40:    AccessToken.create_access_token_for_user!(user, access_token)
app/models/access_token.rb:1:class AccessToken < ApplicationRecord
app/models/access_token.rb:9:    def create_access_token_for_user!(user, token)
app/models/user.rb:2:  has_many :access_tokens
app/models/user.rb:11:  def has_valid_access_token?
app/models/user.rb:12:    access_tokens.where('expires_at > ?', Time.zone.now).exists?
app/services/chat_gpt_service.rb:15:    @client = OpenAI::Client.new(access_token: ENV.fetch("OPENAI_ACCESS_TOKEN"))
app/views/books_search/index.html.erb:23:    const hasValidAccessToken = '<%= current_user&.has_valid_access_token? %>';
app/views/books_search/index.html.erb:28:    if (!hasValidAccessToken) {
config/initializers/openai.rb:2:  config.access_token = ENV.fetch("OPENAI_ACCESS_TOKEN")
db/migrate/20240220141834_create_access_tokens.rb:1:class CreateAccessTokens < ActiveRecord::Migration[7.0]
db/migrate/20240220141834_create_access_tokens.rb:3:    create_table :access_tokens do |t|
test/models/access_token_test.rb:3:class AccessTokenTest < ActiveSupport::TestCase

git grep

コマンド例
git grep -e AccessToken -e access_token -e 'at\.' -n ':!*spec.rb' ':!*schema.rb' > ~/Desktop/result.txt
result.rb
app/controllers/books_search_controller.rb:14:    return redirect_to root_path unless current_user&.has_valid_access_token?
app/controllers/homes_controller.rb:7:      if current_user&.has_valid_access_token?
app/controllers/sessions_controller.rb:15:      save_access_token(user, auth_hash) unless user.has_valid_access_token?
app/controllers/sessions_controller.rb:38:  def save_access_token(user, auth_hash)
app/controllers/sessions_controller.rb:39:    access_token = auth_hash['credentials']['token']
app/controllers/sessions_controller.rb:40:    AccessToken.create_access_token_for_user!(user, access_token)
app/models/access_token.rb:1:class AccessToken < ApplicationRecord
app/models/access_token.rb:9:    def create_access_token_for_user!(user, token)
app/models/user.rb:2:  has_many :access_tokens
app/models/user.rb:11:  def has_valid_access_token?
app/models/user.rb:12:    access_tokens.where('expires_at > ?', Time.zone.now).exists?
app/services/chat_gpt_service.rb:15:    @client = OpenAI::Client.new(access_token: ENV.fetch("OPENAI_ACCESS_TOKEN"))
app/views/books_search/index.html.erb:23:    const hasValidAccessToken = '<%= current_user&.has_valid_access_token? %>';
app/views/books_search/index.html.erb:28:    if (!hasValidAccessToken) {
config/initializers/openai.rb:2:  config.access_token = ENV.fetch("OPENAI_ACCESS_TOKEN")
db/migrate/20240220141834_create_access_tokens.rb:1:class CreateAccessTokens < ActiveRecord::Migration[7.0]
db/migrate/20240220141834_create_access_tokens.rb:3:    create_table :access_tokens do |t|
test/models/access_token_test.rb:3:class AccessTokenTest < ActiveSupport::TestCase

ファイルに出力する場合は、ripgrepgit grepともに変わらない(同じ結果にしたい場合、ripgrepは明示的にsortさせる必要がある)

最後に

個人的には、検索ワードが複数ある場合 ripgrep が使いやすいなと思ってます。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1