Linux環境でのシステム開発業務において、
ログファイルやソースコードなど、ファイルの中から特定の文字列を検索したい場面がよくあります。
そのようなときに便利なのが、grep コマンドです。
- ログファイルからエラーメッセージを検索する
- ソースコードから関数名や変数名を検索する
といったことができるため、作業の効率化には欠かせないコマンドです。
ただ、grep コマンドには様々なオプションがあり、
用途によって使い分ける必要があります。
この記事では、grep コマンドの基本的な使い方から、
開発業務でよく使うオプションまでを具体例とセットでまとめています。
grepコマンドとは
grep コマンドは、ファイル内に含まれる特定の文字列を検索するコマンドです。
ログファイルやソースコードなど、
大量のファイルの中から必要な情報を素早く見つけたいときに使用します。
grepコマンドの基本構文
grep [OPTION] "検索文字列"オプションを指定することで、用途に応じた検索方法で文字列の検索を行います。
システム開発で使用頻度の高い各オプションについては、後述で詳しくまとめています。
grepコマンドの基本的な使い方
特定の文字列を検索する
指定した文字列を検索します。
$ grep "error" test.log
error timeouttest.log というファイル中から “error” の文字列を含む行を検索し、出力します。
大文字・小文字を区別せず検索する
検索文字列の大文字・小文字を区別せずに文字列を検索します。
$ grep -i "error"
ERROR Failed to connect DB
Error User not found
error timeout検索箇所の前後の行も表示する
指定した文字列だけではなく、その前後数行の内容も表示したい場合に、-A、-B、-C オプションを付与することで、検索結果の前後の行も合わせて表示できます。
| オプション | 出力内容 |
|---|---|
| -A | 指定した行数だけ、一致した行の後ろも表示する |
| -B | 指定した行数だけ、一致した行の前表示する |
| -C | 指定した行数だけ、一致した行の前後を表示する |
$ grep -C 1 "Exception"
INFO User login
Exception: Failed to connect DB
INFO Retry processingサブディレクトリも含めて検索する
検索対象としたいファイルがサブディレクトリなど複数のディレクトリに存在する場合、
-r オプションを付与することでディレクトリ配下を再帰的に検索します。
$ grep -r "error"
/var/log/syslog:Mar 20 12:01:23 server error: failed to start service
/var/log/nginx/error.log:Mar 20 12:05:47 error: invalid configuration行番号付きで検索する
指定した検索文字列が含まれる場所(行数)も合わせて知りたい場合、
-n オプションを付与することで、検索文字列が含まれる行数も合わせて出力されます。
$ grep -n "error"
2:ERROR Failed to connect DB
3:error timeout前述の -r オプションと組み合わせて使うことで、
どのファイルの行数かまで出力されるため、一致箇所の特定がしやすくなります。
特定のファイルだけを対象に検索する
検索対象を特定のファイルだけに絞りたい場合、--include オプションを付与することで、指定したファイル名や拡張子のファイルのみを検索できます。
$ grep -r --include="*.log" "error"
/var/log/nginx/error.log:Mar 20 12:05:47 error: invalid configuration
/var/log/app/application.log:Mar 20 12:10:12 error: failed to connect DB特定のファイルを除外して検索する
特定のファイルを検索対象から除外したい場合、--exclude オプションを付与することで、
指定したファイル名や拡張子のファイルを検索対象から除外して検索できます。
$ grep -r --exclude="*.log" "error"
./src/ErrorHandler.java:throw new RuntimeException("error");
./config/app.properties:error.message=System Error正規表現で検索する
正規表現を利用することで、指定した条件に一致する文字列を柔軟に検索できます。
$ grep -E "ERROR|WARN" application.log
ERROR Failed to connect DB
WARN Disk usage is high上記の場合、ERROR または WARN を含む行を検索します。
grepコマンドの実用例
ソースコードから関数の実装箇所や呼び出し箇所を探す
関数名だけが分かっている状態で、
ソースコード全体から実装箇所や呼び出し箇所を検索できます。
$ grep -rn --include="*.c" "checkCollision"
./src/collision.c:42:int checkCollision(Player *player, Enemy *enemy)
./src/game.c:128:if (checkCollision(&player, &enemy)) {
./src/battle.c:85:result = checkCollision(player, boss);
./src/debug.c:23:printf("%d\n", checkCollision(&player, &enemy));このようにgrep検索を実行することで、checkCollision() の実装箇所と呼び出し箇所をまとめて確認することができます。
応用
パイプ(|)と組み合わせた検索
grep は単体でファイルを検索するだけでなく、
パイプ(|)を使って他のコマンドの出力結果に対しても使用することができます。
$ history | grep ip
220 ip a
245 ip route
256 history | grep ipこのように historyコマンドと組み合わせて使用した場合、
過去に実行したコマンドの中から特定の文字列を含むものだけを絞り込んで表示できます。
まとめ
grepコマンドは、ファイルやコマンド出力の中から特定の文字列を検索するためのコマンドです。
オプションを使い分けることで用途に応じて検索条件を柔軟に調整できます。
システム開発業務では主に以下のような用途で使用します。
- ソースコードから関数や処理の実装箇所を探す
- ログファイルからエラーや特定の出力を抽出する
- 他のコマンドと組み合わせることで、コマンドの出力結果を絞り込む
また、本記事で紹介した文字列の検索だけでなく、
ファイルやディレクトリそのものを検索する find コマンドも、
設定ファイルの確認などで活用する機会が多いコマンドです。
find コマンドについても詳しく知りたい方は、以下の記事も参考にしてみてください。
【Linux】findコマンドの使い方|開発業務でよく使うオプションまとめ


コメント