Linuxコマンドgrepの使い方と9つのオプション

Linuxコマンドgrepは、作業中に多くのファイルやテキストデータを扱う際に、必要な情報を迅速に見つけるために重要な役割を果たします。今回のポスティングでは、grepコマンドの基本的な使い方と様々なオプションについてご紹介します。

Linuxコマンドgrepとは?

grepは「global regular expression print」の略で、テキストデータから特定のパターンに一致する行を検索し、出力するコマンドです。ファイルの内容やテキスト出力の中で、特定の単語や文字列を検索する際に便利です。

基本的な使い方

grepコマンドの基本形式は次の通りです。

grep [オプション] 検索する_パターン ファイル名
ShellScript

今後の例で使用するexample.txtのファイル内容は以下の通りです。

Hello, how are you doing today?
It's a pleasure to meet you.
Nice to meet you as well.
HELLO, this is Charles speaking.
Can I assist you with anything?
Do you need any help?
hello, may I ask you a question?
Could you please help me with this?
hello, I'm calling regarding the job posting.
I'd like to make a reservation.
Plaintext

最も基本的な例を見てみましょう。例えば、example.txtファイルで「hello」という単語を検索するには、次のように入力します。

grep "hello" example.txt
ShellScript

このコマンドは、example.txtファイル内の「hello」という単語が含まれるすべての行を次のように出力します。

図1. Linuxコマンドgrep: 文字列helloが含まれる行の出力
図1. Linuxコマンドgrep: 文字列helloが含まれる行の出力

次に、「this」が含まれる行をすべて出力した結果です。

図2. Linuxコマンドgrep: 文字列thisが含まれる行の出力
図2. Linuxコマンドgrep: 文字列thisが含まれる行の出力

主要なオプション

grepコマンドには、検索結果をより細かく制御するための様々なオプションがあります。ここでは、いくつかの重要なオプションを紹介します。

-i (ignore case): 大文字と小文字を区別せずに検索

基本的にgrepは大文字と小文字を区別して検索します。しかし、-iオプションを使用すると、大文字と小文字を区別せずに検索することができます。

grep -i "hello" example.txt
ShellScript

このコマンドは、「Hello」「HELLO」など、大文字と小文字の組み合わせに関係なく「hello」を含むすべての行を出力します。

図3. Linuxコマンドgrep: 大文字と小文字を区別せずに文字列helloが含まれる行を出力
図3. Linuxコマンドgrep: 大文字と小文字を区別せずに文字列helloが含まれる行を出力

-v (invert match): 一致しない行を出力

-vオプションは、検索パターンに一致しない行を出力します。

grep -v "hello" example.txt
ShellScript

このコマンドは、「hello」が含まれないすべての行を出力します。以下では、-iオプションを併用して、大文字小文字を区別せずに「hello」が含まれない行を出力しています。

図4. Linuxコマンドgrep: 大文字と小文字を区別せずに文字列helloが含まれない行を出力
図4. Linuxコマンドgrep: 大文字と小文字を区別せずに文字列helloが含まれない行を出力

-r (recursive): ディレクトリ内のファイルを検索

-rオプションは、指定したディレクトリとそのサブディレクトリ内のすべてのファイルを検索します。

grep -r "hello" /path/to/directory
ShellScript

このコマンドは、/path/to/directoryディレクトリ内のすべてのファイルから「hello」を検索します。以下の図は、現在のディレクトリ下にあるファイルの中で、helloという文字列が含まれる行を出力したものです。最初には、どのファイルにある内容かがわかるように、ファイル名が一緒に出力されます。

図5. Linuxコマンドgrep: 文字列helloが含まれるファイルのすべての行を出力
図5. Linuxコマンドgrep: 文字列helloが含まれるファイルのすべての行を出力

-l (files with matches): パターンが含まれるファイル名を出力

-lオプションは、パターンが含まれるファイル名のみを出力します。

grep -l "hello" *.txt
ShellScript

このコマンドは、現在のディレクトリ内のすべての.txtファイルのうち、「hello」が含まれるファイルの名前を出力します。

図6. Linuxコマンドgrep: helloが含まれるファイル名を出力
図6. Linuxコマンドgrep: helloが含まれるファイル名を出力

-n (line number): 一致する行番号を出力

-nオプションを使用すると、検索パターンと一致する行番号を一緒に出力します。

grep -n "hello" example.txt
ShellScript

このコマンドは、「hello」が含まれる行の番号とともに出力します。

図7. Linuxコマンドgrep: helloが含まれる行の番号を出力
図7. Linuxコマンドgrep: helloが含まれる行の番号を出力

-c (count): 一致する行の数を出力

-cオプションは、パターンと一致する行の数を出力します。

grep -c "hello" example.txt
ShellScript

このコマンドは、example.txtファイルで「hello」が含まれる行の数を出力します。

図8. Linuxコマンドgrep: helloが含まれる行数を出力
図8. Linuxコマンドgrep: helloが含まれる行数を出力

-A (after context), -B (before context), -C (context): コンテキスト行を出力

-Aオプションは、一致する行の後のN行を、-Bオプションは一致する行の前のN行を、-Cオプションは両側のN行を一緒に出力します。

grep -A 2 "hello" example.txt
ShellScript

このコマンドは、「hello」が含まれる行とその後の2行を出力します。以後に2行が存在しない場合は、以下の図のように、表示可能な部分だけが出力されます。

図9. Linuxコマンドgrep: helloが含まれる行とその後の2行を出力
図9. Linuxコマンドgrep: helloが含まれる行とその後の2行を出力

次に、-Bオプションを使用して、「hello」が含まれる行とその前の2行を出力します。

図10. Linuxコマンドgrep: helloが含まれる行とその前の2行を出力
図10. Linuxコマンドgrep: helloが含まれる行とその前の2行を出力

最後に、-Cオプションを使用して、「hello」が含まれる行とその前後2行をすべて出力します。

図11. Linuxコマンドgrep: helloが含まれる行とその前後2行を出力
図11. Linuxコマンドgrep: helloが含まれる行とその前後2行を出力

有用な活用方法

ログファイルの解析

システムログファイルで特定のエラーメッセージを検索する際に役立ちます。例えば、/var/log/syslogファイルで「error」メッセージを検索するには、次のように入力します。

grep "error" /var/log/syslog
ShellScript

ソースコードの検索

ソースコードファイルで特定の関数呼び出しを検索する際に使用できます。例えば、現在のディレクトリ内のすべての.cファイルでmain関数を検索するには、次のように入力します。

grep -n "main" *.c
ShellScript

ディレクトリ内のファイル内容を検索

特定のディレクトリ内のすべてのファイルから検索する際に便利です。例えば、/etcディレクトリ内のすべてのファイルで「network」という単語を検索するには、次のように入力します。

grep -r "network" /etc
ShellScript

まとめ

今回のポスティングでは、grepコマンドの基本的な使い方と様々なオプションについて解説しました。grepは、ファイルやテキストデータを効率的に検索するための強力なツールであり、ログファイルの解析、ソースコードの検索、ディレクトリ内のファイル内容の検索など、様々な用途で活用できます。複数のオプションを適切に活用し、自分にとって最適な検索結果を得ることができるでしょう。grepを上手に活用することで、Linuxでの作業効率が大幅に向上するでしょう。

リファレンス

関連ポスト

コメントする