こんにちは、インフラエンジニアのryuです。
今回はLinuxのgrepコマンドについて解説します。Linuxでファイルの中から文字列を検索したい場合、grepコマンドを使用します。
ただ、初めて使うと、検索したい文字列とファイル名をどの順番で書けばよいのか迷いますよね。オプションも多いため、何から覚えるべきかわからない方もいると思います。
この記事では、grepコマンドの基本から、大文字と小文字を区別しない検索、下位ディレクトリを含む検索、行番号の表示、除外検索まで解説します。
Linuxのgrepコマンドで文字を検索する方法¶
Linuxでファイルの中身を検索したいときがあると思います。例えば、設定値の確認をしたり、ログファイルの中身を探したり・・・
そのような時に使えるコマンドがgrep(グレップ)です。指定した文字列を含む行だけを抽出できるため、長いファイルを最初から最後まで目で追う必要がありません。
grepコマンドとは?¶
grepコマンドは、ファイルやコマンドの実行結果から、指定した条件に一致する行を検索するコマンドです。
たとえば、1000行あるログファイルの中からERRORを含む行だけを表示できます。必要な情報を絞り込めるので、調査時間を短縮できます。
エンジニアとして10年ほどLinuxサーバーを扱ってきましたが、grepを使わない日はほとんどありません。障害調査では、まずgrepでエラーや対象時刻を絞り、その後に前後のログを確認する流れがよくあります。
| やりたいこと | grepでできること |
|---|---|
| 文字列を検索する | 指定した文字列を含む行を表示する |
| エラーを探す | ログからERRORやfailedを含む行を抽出する |
| 大文字小文字を無視する | -iオプションで表記の違いをまとめて検索する |
| ディレクトリ内を検索する | -rオプションで下位ディレクトリまで調べる |
| 一致しない行を表示する | -vオプションで不要な行を除外する |
| 行番号を確認する | -nオプションで該当箇所の行番号を表示する |
grepは、検索結果を表示するだけなので、元のファイルを書き換えません。初心者でも試しやすいコマンドです。
grepコマンドの基本的な使い方¶
grepコマンドは以下のように使用します。
grep [検索したい文字列] [検索するファイル]
たとえば、test.txtというファイルからtestを検索する場合は、次のように実行します。
grep test test.txt
このコマンドの動作は、”test.txt”というファイルの中から”test”という文字列を抽出します。
検索文字列に空白が含まれる場合は、シングルクォートかダブルクォートで囲みます。
grep 'login failed' system.log
クォートで囲まないと、loginとfailedが別々の引数として扱われます。複数の単語を検索するときは、ひとまとまりにすることを意識しましょう。
Linuxでgrepコマンドを使ってみる¶
先ほどはgrepコマンドの基本文法を解説しました。それだけでは理解できないと思うので、実際にファイルを作成して、中身を検索してみましょう。
検索用のファイルを作成する¶
まず、test.txtを作成します。ファイルの中身に”test”という文字列を挿入します。作成したら、catコマンドでファイルの中身を確認します。
echo "test" > test.txt
cat test.txt
実行結果は次のとおりです。
test
Linuxで実行すると以下のようになります。
testファイルが作成されていますね。
では、この”test.txt”ファイルからgrepコマンドを使用して”test”という文字列を抽出してみます。
grep test test.txt
実行結果は次のとおりです。
test

testという文字列が出力されました。
これがgrepコマンドの基本的な使い方です。
grepは、文字列の一部分が一致した場合も、その文字列を含む行全体を表示します。単語だけを切り取るのではなく、該当行を抽出するコマンドだと覚えておきましょう。
grepコマンドでよく使うオプション¶
先ほどまで、grepコマンドの基本的な使い方を紹介しました。
ここからは実践編です。
grepには多くのオプションがありますが、すべてを一度に暗記する必要はありません。まずは、日常的によく使うものから覚えましょう。
| オプション | 動作 | 使用例 |
|---|---|---|
-i |
大文字と小文字を区別しない | grep -i error app.log |
-r |
下位ディレクトリを含めて検索する | grep -r nginx /etc |
-n |
一致した行の行番号を表示する | grep -n error app.log |
-v |
一致しない行を表示する | grep -v INFO app.log |
-c |
一致した行数を表示する | grep -c error app.log |
-l |
一致したファイル名だけを表示する | grep -rl error logs/ |
-w |
単語単位で完全一致させる | grep -w root /etc/passwd |
-E |
拡張正規表現を使用する | grep -E 'ERROR|WARN' app.log |
-F |
正規表現ではなく固定文字列で検索する | grep -F '192.168.1.1' access.log |
grep -iで大文字と小文字を区別せずに検索する¶
-iのオプションを付けると大文字と小文字を区別なしで検索することができます。
では、どのような動作になるのか試してみましょう。
まず、ファイルを作成します。test1.txtというファイルに”TEST test”という文字列を入れます。
echo "TEST" > test1.txt
echo "test" >> test1.txt
cat test1.txt
ファイルの中身は次のようになります。
TEST
test
そして、grepで-iが付いている場合とそうでない場合の挙動の違いを確認してみましょう。
grep test test1.txt
実行結果は、小文字のtestだけです。
test
続いて、-iを付けて実行します。
grep -i test test1.txt
実行結果は次のようになります。
TEST
test

“-i”を付けると大文字小文字に関係なく抽出することができました。
ログによっては、Error、ERROR、errorのように表記が統一されていないことがあります。そのような場合は、-iを付けると検索漏れを防ぎやすくなります。
grep -rで下位ディレクトリまで検索する¶
最後に”-r”のオプションです。再帰的に下位フォルダを検索することができます。
では、動作の確認をしてみましょう。
まず、testdir/ディレクトリの配下にtest2.txtを作成します。
mkdir testdir
echo "test" > testdir/test2.txt
これで、testdir/test2.txtが作成されました。次にオプション無しでgrepしてみます。そうするとエラーが出ます。
grep test testdir
次のように、指定した対象がディレクトリであることを示すメッセージが表示されます。
grep: testdir: Is a directory
「grep: testdir: Is a directory」はディレクトリというエラーです。
-rのオプションを付けて、testdirディレクトリを再帰的に検索します。
grep -r test testdir
実行結果は次のとおりです。
testdir/test2.txt:test
そうすると、testという文字列がtest2.txtにあるよ!という結果が返ってきます。

grepなどLinuxのコマンドを勉強するならInfraAcademy¶
grepなどLinuxのコマンドを勉強するならInfraAcademyがおすすめです。
「Linuxの実践的な内容を学習したい」、「コマンドを打ちながらLinuxを学習したい」
そのようなご要望にお応えして、Linuxやネットワークが学習できるサイトInfraAcademyをリリースしました!
入門から中級まで初心者でもわかりやすく学習を進めることができます。
Linuxコマンドは、読んだだけではなかなか身につきません。実際に入力し、結果を確認しながら進めることで、オプションの違いも理解しやすくなります。
↓InfraAcademyの講座の一部です。
上記以外にも、DNSサーバーの構築方法や、Dockerの設定方法などさまざまな講座があります。
インフラエンジニアに必要な知識が学習できます。
参考:Linuxのコマンド練習用サイトのInfraAcademyを作成しました。【Linuxのコマンドをブラウザで練習しよう】
grepコマンドの便利な使い方¶
ここからは、実務でも使いやすいgrepの検索方法を紹介します。
基本形と-i、-rを理解した後に覚えると、設定確認やログ調査がさらにスムーズになります。
-nオプションで行番号を表示する¶
検索結果がファイルの何行目にあるのか確認したい場合は、-nオプションを使います。
grep -n test test1.txt
実行結果は、行番号と内容がコロンで区切られて表示されます。
2:test
設定ファイルを修正するときは、該当箇所の行番号がわかると便利です。ほかのメンバーへ、何行目を確認してほしいと伝える場合にも役立ちます。
-vオプションで一致する行を除外する¶
-vオプションは、指定した文字列を含まない行を表示します。
たとえば、ログから正常なINFO行を除外し、それ以外を確認する場合は次のように実行します。
grep -v INFO application.log
表示したくない情報を指定するため、除外検索と考えると理解しやすいです。コメント行や空行を除外するときにも使えます。
grep -v '^#' setting.conf
先頭が#の行を除外する例です。設定ファイルの有効な値だけを確認したいときに便利です。
-cオプションで一致した行数を数える¶
検索結果の内容ではなく、該当する行数だけ知りたい場合は-cオプションを使います。
grep -c ERROR application.log
エラーが発生した回数をざっくり確認したいときに使えます。ただし、1行にERRORが複数回あっても、数えるのは一致回数ではなく一致した行数です。
-lオプションでファイル名だけを表示する¶
複数のファイルを検索し、どのファイルに文字列が含まれるのか確認したい場合は-lオプションを使います。
grep -rl database /etc/myapp/
-rで下位ディレクトリまで検索し、-lで一致したファイル名だけを表示します。設定値がどのファイルに書かれているのかわからないときに便利です。
grepコマンドをパイプと組み合わせる¶
grepは、ファイルだけでなく、別のコマンドの実行結果も検索できます。
Linuxでは、コマンドの出力を別のコマンドへ渡す|をパイプと呼びます。
psコマンドの結果からプロセスを検索する¶
実行中のプロセスから、nginxに関係する行を検索する場合は次のように実行します。
ps aux | grep nginx
ps auxの結果がgrepへ渡され、nginxを含む行だけが表示されます。プロセスが起動しているか確認するときによく使う形です。
ただし、grepコマンド自身の行も表示されることがあります。それを除外する例は次のとおりです。
ps aux | grep nginx | grep -v grep
最近はpgrepを使う方法もありますが、パイプとgrepの練習として覚えておくとよいでしょう。
catコマンドは必須ではない¶
次のような書き方を見たことがあるかもしれません。
cat application.log | grep ERROR
このコマンドでも検索できますが、grepはファイルを直接指定できます。
grep ERROR application.log
単純な検索であれば、後者の方が短く読みやすいです。一方、複数のコマンドを順番につなぐときは、パイプを使う場面もあります。
【関連記事】Linuxでログ監視するコマンドtailとlessの使い方
grepコマンドを使うときの注意点¶
grepは便利ですが、検索対象や書き方によっては、結果が多すぎたり検索に時間がかかったりします。
初心者がつまずきやすい点を確認しておきましょう。
特殊記号は正規表現として扱われる¶
grepの検索文字列では、.や*、[などが特別な意味を持つ場合があります。
たとえば、IPアドレスの192.168.1.1を文字どおり検索したいなら、-Fオプションを使うと安全です。
grep -F '192.168.1.1' access.log
-Fは、検索文字列を正規表現ではなく固定文字列として扱います。記号を含む値をそのまま探したいときに便利です。
Linuxのgrepコマンドまとめ¶
最後におさらいです。
Linuxのgrepコマンドで文字を検索する基本形は以下の通りです。
grep [検索したい文字列] [検索するファイル]
grepは、ファイルやコマンド結果から条件に一致する行を探すコマンドです。まずは基本形、-i、-r、-n、-vの5つを使えるようにしてみましょう。
エンジニアとして実務でLinuxを操作していると、ログ調査や設定確認でgrepを何度も使います。複雑なオプションを暗記するより、実際のファイルを作り、検索結果の違いを確かめる方が身につきます。
grepコマンドを使いこなして、Linux作業のスピードを上げましょう。