/Linuxコマンド

検索

文字列を探す(grep・rg)

ファイルの中から文字列やパターンを探す grep と、より速い ripgrep(rg)。正規表現の早見表つき。

grepパターンに一致する行を探す

ファイルの中や、ほかのコマンドの出力から、指定した文字列やパターンを含む行を探して表示します。

bash
grep [オプション] <パターン> [ファイル...]
オプション意味
-i大文字小文字を区別しない
-r / -Rディレクトリを再帰的に探す(-R はシンボリックリンクもたどる)
-n行番号を表示
-v一致しない行を表示
-w単語として一致するものだけ
-x行全体が一致するものだけ
-c一致した行数だけ表示
-l / -L一致した / しなかったファイル名だけ表示
-o一致した部分だけ表示
-E拡張正規表現(egrep と同じ)
-F正規表現ではなく、そのままの文字列として探す(fgrep と同じ)
-A N / -B N / -C N一致した行の後 / 前 / 前後 N 行も表示
-eパターンを複数指定する
--include / --exclude探すファイル名を絞る / 除く
--exclude-dir除くディレクトリ
bash
$ grep -n "TODO" main.go
$ grep -rni "password" ./config
$ grep -rl "useState" src/ --include='*.tsx'
$ grep -v '^#' nginx.conf | grep -v '^$'      # コメントと空行を除く
$ grep -E 'error|warn' app.log
$ grep -o '[0-9]\{1,3\}\(\.[0-9]\{1,3\}\)\{3\}' access.log | sort | uniq -c | sort -rn | head   # IPアドレスの集計
$ grep -C 3 "panic" server.log
$ ps aux | grep [n]ginx                        # grep 自身を結果に含めない小技

rg (ripgrep)速くて賢い grep

Ubuntu には最初から入っていません。 で入れられます。

.gitignore を自動で読み、node_modules などを飛ばして再帰的に探します。大きなリポジトリでも grep -r よりずっと速いです。

オプション意味
-i / -S大文字小文字を区別しない / パターンに大文字があるときだけ区別する
-w単語として一致
-Fそのままの文字列として探す
-t <種類> / -T <種類>指定した種類のファイルだけ / 除く(rg --type-list で一覧)
-g '<glob>'ファイル名で絞る(! を付けると除く)
-lファイル名だけ
-cファイルごとの件数
-C N前後 N 行も表示
--hidden / -uu隠しファイルも / .gitignore も無視して全部探す
-r <置換>表示するときに一致部分を置き換える(ファイルは書き換えない)
bash
$ rg "fetchUser"
$ rg -t go "func main"
$ rg -g '*.md' -g '!node_modules' "TODO"
$ rg -l "deprecated" | xargs sed -i 's/oldApi/newApi/g'
$ rg --hidden "API_KEY"
$ rg -F "a.b(c)"                 # 記号をそのまま探す

正規表現の早見表

書き方意味grep(基本) での書き方
.任意の1文字同じ
^ / $行頭 / 行末同じ
*直前を0回以上同じ
+ / ?直前を1回以上 / 0か1回\+ / \?
{m,n}直前をm〜n回\{m,n\}
[abc] / [^abc]どれか1文字 / それ以外同じ
(a|b)a か b\(a|b\)
\b単語の境目同じ
\d / \s / \w数字 / 空白 / 英数字[0-9] / [[:space:]] / \w