grepを便利に使いたい|よく使うオプションを少しずつ覚える

こんにちは、さるまりんです。

Linuxやシェルのコマンドを使っていると、

grep

というコマンドを見かけることがあります。

というか、けっこう多用します。

これまでの記事の中でも、何度か grep は出てきました。

たとえば、

docker ps | grep nginx

のように、Dockerのコンテナ一覧から nginx を含む行を探したり、

history | grep docker

のように、コマンド履歴の中から docker を含むものを探したり。

ほかにも、ログやファイルの中から、特定の文字、たとえば ERROR なんかを探したいときに grep はよく使います。

僕自身も、grep は便利に使いたいコマンドのひとつです。

なんとなく、

「文字を探すコマンド」

ということはわかっていても、オプションまで含めて使えるようになると、かなり楽になります。

今回は、grep のよく使うオプションを、見ていきたいと思います。

grepは「探す」ためのコマンド

grep は、ファイルやコマンドの出力の中から、指定した文字を含む行を探すためのコマンドです。

たとえば、app.log というログファイルがあるとします。

その中から error という文字を含む行を探したいときは、こんなふうに書きます。

grep "error" app.log

これは、

app.log の中から、error を含む行を表示する

という意味です。

ログファイルは、行数がとても多くなることがあります。

全部を上から読んでいくのは大変です。

そんなときに、まずは grep で必要そうな行だけ探すと、かなり見やすくなります。

まずは基本のgrep

たとえば、こんなログがあったとします。

2026-09-21 10:00:01 INFO started application
2026-09-21 10:00:05 INFO connected database
2026-09-21 10:01:12 ERROR failed to read file
2026-09-21 10:02:30 WARN retrying request
2026-09-21 10:03:18 ERROR timeout occurred

ここから ERROR を含む行だけ見たいときは、こう書きます。

grep "ERROR" app.log

すると、こういう行だけが表示されます。

2026-09-21 10:01:12 ERROR failed to read file
2026-09-21 10:03:18 ERROR timeout occurred

grep は、見つかった文字だけを表示するというより、

指定した文字を含む行を表示する

と考えるとわかりやすいです。

つまり、ERROR という文字が含まれている行ごと出してくれます。

ログを読むときには、この「行ごと出してくれる」というのが便利です。

前後に日時やメッセージがあるので、

いつ、何が起きたのか

をそのまま確認できます。

-i:大文字小文字を気にせず探す

次は -i です。

grep -i "error" app.log

-i をつけると、大文字と小文字を区別せずに探せます。

たとえば、ログの中に、

ERROR failed to read file
Error timeout occurred
error invalid input

のように、大文字と小文字が混ざっていることがあります。

このとき、

grep "error" app.log

と書くと、小文字の error だけを探します。

ERRORError は見つからないことがあります。

そこで、

grep -i "error" app.log

とすると、ERRORErrorerror もまとめて探せます。

ログを見るときは、大文字小文字の表記がそろっていないこともあります。

「とりあえず error を探したい」

というときには、-i をつけておくと安心です。

-n:行番号も一緒に表示する

次は -n です。

grep -n "ERROR" app.log

-n をつけると、見つかった行の行番号も一緒に表示されます。

たとえば、こんな感じです。

3:2026-09-21 10:01:12 ERROR failed to read file
5:2026-09-21 10:03:18 ERROR timeout occurred

先頭に出ている 3:5: が行番号です。

これが便利なのは、あとからエディタでその場所を見たいときです。

大きな設定ファイルやログファイルの中で、

「どのあたりに書いてあるのか」

がわかると、次の確認がしやすくなります。

たとえば、設定ファイルの中から database を探すなら、

grep -n "database" config.php

のように書けます。

どの行にあるかまでわかるので、ただ探すより少し便利です。

-v:含まない行を探す

次は -v です。

grep -v "DEBUG" app.log

-v をつけると、指定した文字を含まない行を表示できます。

普通の grep は、

含む行を探す

でした。

-v はその逆で、

含まない行を探す

です。

たとえば、ログの中に DEBUG の行がたくさんあるとします。

INFO started application
DEBUG user id = 10
DEBUG request parameter = test
ERROR failed to read file
INFO finished

ここから DEBUG の行を除いて見たいときは、

grep -v "DEBUG" app.log

と書きます。

すると、DEBUG を含まない行だけが残ります。

INFO started application
ERROR failed to read file
INFO finished

ログを見るとき、

「これを探したい」

だけではなく、

「これは多すぎるから除きたい」

ということもあります。

そういうときに -v は便利です。

grep -v は、情報を減らして見やすくするためのコマンドとしても使えます。

-r:フォルダの中からまとめて探す

次は -r です。

grep -r "TODO" .

-r をつけると、フォルダの中を再帰的に探せます。

「再帰的」recursive という言葉は少し固いですが、ここでは、

そのフォルダの中にあるファイルや、さらにその中のフォルダまで探す

くらいに考えるとよさそうです。

たとえば、今いるフォルダ以下から TODO を探したいときは、

grep -r "TODO" .

と書きます。

最後の . は、今いるフォルダという意味です。

コードを書いていると、

TODO
FIXME
deprecated

のような文字を探したくなることがあります。

そういうときに、ファイルをひとつずつ開いて探すのは大変です。

grep -r を使うと、フォルダの中をまとめて探せます。

たとえば、PHPファイルの中から function を探すなら、

grep -r "function" .

のようにできます。

ただ、プロジェクトによってはファイル数が多くて、結果がたくさん出すぎることもあります。

その場合は、あとで出てくるパイプや、検索対象のフォルダをしぼることも考えます。

-E:複数の言葉をまとめて探す

次は -E です。

grep -E "ERROR|WARN" app.log

-E を使うと、少し広い書き方で検索できます。

たとえば、

grep -E "ERROR|WARN" app.log

は、

ERROR または WARN を含む行を探す

という意味です。

| は「または」のような意味で使っています。

ログを見るとき、

エラーだけでなく警告も一緒に見たい

ということがあります。

そんなときに、

grep -E "ERROR|WARN" app.log

と書くと、ERROR の行も WARN の行もまとめて確認できます。

たとえば、こんなログがあったとして、

INFO started application
WARN retrying request
ERROR failed to read file
INFO finished

grep -E "ERROR|WARN" app.log とすると、

WARN retrying request
ERROR failed to read file

のように表示されます。

-E は、正規表現を少し使いやすくするオプションです。

正規表現を全部覚えようとすると大変ですが、まずはこの

grep -E "A|B"

で、

AまたはBを探す

くらいからでも十分便利です。

-q:表示せず、見つかったかだけ使う

次は -q です。

grep -q "ERROR" app.log

-q をつけると、見つかった行を画面に表示しません。

では、何のために使うのでしょうか。

これは、

見つかったかどうかだけを使いたい

ときに便利です。

たとえば、シェルスクリプトの中で、

if grep -q "ERROR" app.log; then
    echo "エラーがあります"
else
    echo "エラーは見つかりませんでした"
fi

のように書けます。

この場合、grep の結果を画面に出したいわけではありません。

ERROR が見つかったかどうかで、次の処理を変えたいわけです。

grep -q は、記事の中でログを見せるというより、スクリプトの条件判定でよく使うイメージです。

画面に出すための grep

判定に使うための grep -q

この違いを知っておくと、シェルスクリプトも少し読みやすくなります。

オプションは組み合わせられる

ここまで、いくつかのオプションを見てきました。

grep のオプションは、組み合わせて使うこともできます。

たとえば、

grep -in "error" app.log

これは、

大文字小文字を気にせず、error を探して、行番号も表示する

という意味です。

-i-n を組み合わせています。

分けて書くなら、

grep -i -n "error" app.log

でも同じように使えます。

短くまとめて、

grep -in "error" app.log

と書くこともできます。

ログを調べるときには、この組み合わせはけっこう便利です。

大文字小文字の違いは気にせず探したい。
でも、あとで場所を見たいから行番号もほしい。

そんなときですね。

ほかにも、

grep -rin "TODO" .

のように書けば、

今いるフォルダ以下から、大文字小文字を気にせず TODO を探して、行番号も出す

ということができます。

はじめから全部を覚える必要はありません。

でも、

-i
-n
-v
-r
-E
-q

このあたりを知っておくと、かなり使える場面が増えます。

パイプと組み合わせるとさらに便利

grep は、ファイルに対して使うだけではありません。

ほかのコマンドの結果を受け取って、その中から必要な行だけ探すこともできます。

そのときによく使うのが、パイプです。

docker ps | grep nginx

これは、

docker ps の結果から、nginx を含む行だけ探す

という意味です。

docker ps はコンテナの一覧を表示します。

でも、コンテナがたくさんあると、見たいものを探すのが少し大変です。

そこで、grep nginx をつなげると、nginx を含む行だけにしぼれます。

ほかにも、

history | grep docker

のように書くと、コマンド履歴の中から docker を含むものを探せます。

「あれ、前に打ったdockerコマンド、何だったかな」

というときに便利です。

ログでも同じです。

cat app.log | grep "ERROR"

のように書くこともできます。

ただし、ファイルを直接指定できる場合は、

grep "ERROR" app.log

の方がすっきりしています。

パイプは、ほかのコマンドの結果をしぼりたいときに使う。

ファイルから直接探せるなら、grep "文字" ファイル名 で探す。

このくらいに分けておくと、使いどころが見えやすくなります。

docker logsとも組み合わせられる

ログを見る話でいうと、docker logs とも組み合わせられます。

たとえば、my-app というコンテナのログから ERROR を探すなら、

docker logs my-app | grep "ERROR"

のように書けます。

docker logs my-app でログを表示して、その結果を grep "ERROR" に渡しています。

さらに、大文字小文字を気にせず探したいなら、

docker logs my-app | grep -i "error"

とできます。

行番号も見たいなら、

docker logs my-app | grep -in "error"

のように書けます。

コンテナのログは、量が多くなることがあります。

全部を眺めるよりも、まずは grep で気になる言葉を探すと、調査の入口を作りやすいです。

たとえば、

docker logs my-app | grep -i "exception"
docker logs my-app | grep -E "ERROR|WARN|Exception"

のように、気になる言葉でしぼっていくことができます。

もちろん、ログの見方はこれだけではありません。

でも、

たくさん出てくる文字の中から、まずは必要そうな行を見つける

という意味では、grep はとても頼りになります。

grepは「全部見る」から「必要なところを見る」に変えてくれる

grep を使えると、コマンドの結果やログの見方が少し変わります。

全部を上から見る。

その中から目で探す。

これもできなくはありません。

でも、量が多くなると、なかなか大変です。

grep を使うと、

まず関係ありそうな行だけにしぼる

という見方ができます。

たとえば、

エラーを探す。
特定のユーザーIDを探す。
設定名を探す。
TODOコメントを探す。
過去に打ったコマンドを探す。

こういうことが、少し楽になります。

特にログを見るときは、

何が起きているかわからない

という状態から始まることが多いです。

そのときに、grep で気になる言葉を探せると、調査の最初の一歩を作れます。

grep は派手なコマンドではありません。

でも、かなり長く使えるコマンドです。

まとめ

今回は、grep のよく使うオプションを見てきました。

基本は、

grep "探したい文字" ファイル名

です。

ファイルの中から、指定した文字を含む行を探せます。

よく使うオプションとしては、

-i  大文字小文字を気にせず探す
-n  行番号も表示する
-v  含まない行を表示する
-r  フォルダの中もまとめて探す
-E  少し広い条件で探す
-q  表示せず、見つかったかだけ使う

があります。

最初から全部を完璧に覚えなくても大丈夫です。

まずは、

grep -in "error" app.log

のように、大文字小文字を気にせず、行番号つきで探す。

そこから始めても十分便利です。

そして、慣れてきたら、

grep -v "DEBUG" app.log

でいらない行を除いたり、

grep -r "TODO" .

でフォルダの中をまとめて探したり、

grep -E "ERROR|WARN" app.log

で複数の言葉をまとめて探したりできます。

grep は、全部を読むためのコマンドではなく、

必要なところに近づくためのコマンド

なのだと思います。

ログを見るときも、ファイルを探すときも、コマンドの結果をしぼるときも。

grep が使えると、少しだけ手元の作業が楽になります。

こういう小さな便利さを、少しずつ増やしていきたいですね。

読んでくださってありがとうございます。

ではまた!