InfraAcademy

InfraAcademy Blog

Linuxのgrepコマンドの使い方を解説!文字列検索でよく使うオプションも紹介

| #Linux #コマンド #Linux入門 #grep

こんにちは、インフラエンジニアのryuです。

今回はLinuxのgrepコマンドについて解説します。Linuxでファイルの中から文字列を検索したい場合、grepコマンドを使用します。

ただ、初めて使うと、検索したい文字列とファイル名をどの順番で書けばよいのか迷いますよね。オプションも多いため、何から覚えるべきかわからない方もいると思います。

この記事では、grepコマンドの基本から、大文字と小文字を区別しない検索、下位ディレクトリを含む検索、行番号の表示、除外検索まで解説します。

Linuxのgrepコマンドで文字を検索する方法

Linuxでファイルの中身を検索したいときがあると思います。例えば、設定値の確認をしたり、ログファイルの中身を探したり・・・

そのような時に使えるコマンドがgrep(グレップ)です。指定した文字列を含む行だけを抽出できるため、長いファイルを最初から最後まで目で追う必要がありません。

grepコマンドとは?

grepコマンドは、ファイルやコマンドの実行結果から、指定した条件に一致する行を検索するコマンドです。

たとえば、1000行あるログファイルの中からERRORを含む行だけを表示できます。必要な情報を絞り込めるので、調査時間を短縮できます。

エンジニアとして10年ほどLinuxサーバーを扱ってきましたが、grepを使わない日はほとんどありません。障害調査では、まずgrepでエラーや対象時刻を絞り、その後に前後のログを確認する流れがよくあります。

やりたいこと grepでできること
文字列を検索する 指定した文字列を含む行を表示する
エラーを探す ログからERRORfailedを含む行を抽出する
大文字小文字を無視する -iオプションで表記の違いをまとめて検索する
ディレクトリ内を検索する -rオプションで下位ディレクトリまで調べる
一致しない行を表示する -vオプションで不要な行を除外する
行番号を確認する -nオプションで該当箇所の行番号を表示する

grepは、検索結果を表示するだけなので、元のファイルを書き換えません。初心者でも試しやすいコマンドです。

grepコマンドの基本的な使い方

grepコマンドは以下のように使用します。

grep [検索したい文字列] [検索するファイル]

たとえば、test.txtというファイルからtestを検索する場合は、次のように実行します。

grep test test.txt

このコマンドの動作は、”test.txt”というファイルの中から”test”という文字列を抽出します。

検索文字列に空白が含まれる場合は、シングルクォートかダブルクォートで囲みます。

grep 'login failed' system.log

クォートで囲まないと、loginfailedが別々の引数として扱われます。複数の単語を検索するときは、ひとまとまりにすることを意識しましょう。

Linuxでgrepコマンドを使ってみる

先ほどはgrepコマンドの基本文法を解説しました。それだけでは理解できないと思うので、実際にファイルを作成して、中身を検索してみましょう。

検索用のファイルを作成する

まず、test.txtを作成します。ファイルの中身に”test”という文字列を挿入します。作成したら、catコマンドでファイルの中身を確認します。

echo "test" > test.txt
cat test.txt

実行結果は次のとおりです。

test

Linuxで実行すると以下のようになります。

echo "test" > test.txt testファイルが作成されていますね。

では、この”test.txt”ファイルからgrepコマンドを使用して”test”という文字列を抽出してみます。

grep test test.txt

実行結果は次のとおりです。

test

grep test test.txt

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

grep -i 大文字と小文字を区別なしで検索

“-i”を付けると大文字小文字に関係なく抽出することができました。

ログによっては、ErrorERRORerrorのように表記が統一されていないことがあります。そのような場合は、-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 -r 再帰的に検索

grepなどLinuxのコマンドを勉強するならInfraAcademy

grepなどLinuxのコマンドを勉強するならInfraAcademyがおすすめです。

「Linuxの実践的な内容を学習したい」、「コマンドを打ちながらLinuxを学習したい」

そのようなご要望にお応えして、Linuxやネットワークが学習できるサイトInfraAcademyをリリースしました!

入門から中級まで初心者でもわかりやすく学習を進めることができます。

Linuxコマンドは、読んだだけではなかなか身につきません。実際に入力し、結果を確認しながら進めることで、オプションの違いも理解しやすくなります。

↓InfraAcademyの講座の一部です。

上記以外にも、DNSサーバーの構築方法や、Dockerの設定方法などさまざまな講座があります。

インフラエンジニアに必要な知識が学習できます。

InfraAcademyで学習を始める

参考: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作業のスピードを上げましょう。

【関連記事】Linuxでファイル検索をするfindコマンドの使い方

Next Action

記事で読んだ内容を、講座で実装してみましょう

InfraAcademyでは、ブラウザ上でLinuxやネットワークの実践環境を使いながら学習できます。無料で始められる講座から、学習の流れを試せます。

この記事を書いた人

ryu

InfraAcademy運営 / エンジニア

エンジニア歴10年。Linux、ネットワーク、クラウドを中心に、実務で役立つインフラ技術を初心者にもわかりやすく解説しています。

X: @ryu63614894

Related

関連記事

ブログ一覧へ

Roadmap

まずはこの4講座から

ログインすれば無料で始められる講座です。気になったテーマから手を動かして学べます。

講座一覧を見る