What Is GREP in Linux and How Do You Use It

A photograph of a person working on his laptop.

Grepは、一致するパターンを見つけるための小さなUNIXプログラムです。最初はV6 UNIXでリリースされ、現在ではLinux、macOS、BSDなどほぼすべてのUNIX系システムで見つけることができます。この記事では、Grepの基本について説明し、日常の作業に役立ついくつかの使用例を示します。

Grepの基本

Grepの本質はシンプルでストレートフォワードなプログラムです。入力を受け取り、入力内の欲しいテキストを探し、一致する結果を出力します。Grepは、ほぼすべてのプレーンテキストソースを処理できます。これにより、他のコマンドからの入力を読み取ったり、ファイルを直接調べたりすることができます。

Grepを始める最も簡単な方法は、テキストファイルからデータを読み取ることです。例えば、次のコマンドはmy sample.txtファイルの内容を印刷します:

grep'' sample.txt

さらに、この機能を使用して、テキストファイル内の特定のテキストを検索できます:

grep'word' sample.txt

A terminal showing Grep's simple word matching feature.

GrepはUNIXパイプとともに使用することもでき、複数のプログラムを単一のコマンドで結合できます:

cat sample.txt |grep''

A terminal showing Grep printing the entire file when running without any arguments.

知っておくと良いこと: UNIXの知識を広げたいですか?私たちのGNU lessのチートシートをチェックして、Linuxでのスクリーンページャーの使い方を学びましょう。

ディレクトリ内のファイルを見つける

Grepでできる最も簡単な作業の1つは、ディレクトリリストにおけるファイルを見つけることです。これを行うには、lsコマンドの出力をUNIXパイプを介してGrepに送ります。

次のコマンドは、あなたのダウンロードフォルダ内の.jpgファイル拡張子を持つすべてのファイルを印刷し、ハイライトします:

ls ~/Downloads |grep \\.jpg

A terminal showing Grep filtering file lists based on file extension.

さらに、より複雑なls出力をGrepに送信して、パターンマッチングに使用できます。例えば、次のコマンドはサイズが1MB未満のディレクトリ内のファイルをすべてリストします:

ls-lh ./|grep .K

大文字小文字を無視

デフォルトでは、UNIX系システムのほとんどのプログラムは大文字小文字を区別します。これは、システムが”Hello”を”hello”、”hEllo”、”helLo”とは異なるものとして扱うことを意味します。

A terminal showing Grep's default case sensitive behavior.

ファイル内に文字列を探しているとき、この動作は煩わしいことがあります。例えば、エッセイには同時に”Hello”と”hello”の両方が含まれている可能性があります。これに対処するためには、-iフラグを使用して、検索したい文字列を続けてGrepを実行します。

grep-i Hello hello.txt

A terminal showing the -i flag disabling Grep's case sensitivity.

再帰検索

Grepは、同時に複数のファイルやディレクトリを検索できます。これは、複数のファイルで作業をしていて、特定のテキストがディレクトリ内でどこに現れるかを知りたいときに便利です。例えば、次のコマンドは”MakeTechEasier”という単語を”sample”ディレクトリ内で検索します:

grep-r'MakeTechEasier' ./sample

つまり、-rフラグを使用すると、Grepはターゲットディレクトリ内のすべてのファイルを調べます。これは、検索しているフォルダ内に非テキストファイルがある場合には問題になることがあります。それを防ぐために、-Iフラグを使用してGrepを実行します:

grep-rI'MakeTechEasier' ./sample

余談ですが: ターミナルでファイルを作成する方法を学ぶにはtouchコマンドを使用します。

文字列を含むファイルを一致させる

特定の文字列が異なるファイルに何回出現するかを示すだけでなく、Grepを使用して特定のテキストを含むファイルのリストを作成することもできます。これは、ファイルが特定の文字列を含んでいるかどうかを知りたいが、Grepがターミナルにそのすべてのインスタンスを表示しないようにしたい場合に便利です。

これを行うには、-r-lフラグを使用して、マッチングしたい文字列と見たいディレクトリを指定してGrepを実行します:

grep-rl MakeTechEasier ./sample

GrepコマンドをBashサブシェル内に囲むことで、テキストマッチングの複数の条件を作成することさえできます。例えば、次のコード行は、”Hello”と”MakeTechEasier”の両方を含むファイルのみを返します:

grep-rl MakeTechEasier $(grep-rl Hello ./sample)

反対を見つける

直接の検索をするだけでなく、Grepは最初の基準に一致しない結果も返すことができます。一見逆説的に思えるかもしれませんが、これはテキスト入力からのエラーや異常を強調する必要がある場合に役立ちます。

これを行うには、-vを使用して、他の有効にしたいフラグと共にGrepを実行します。例えば、次のコマンドは、”/etc/nginx”フォルダ内のすべてのファイルを再帰的に検索し、”nginx”という文字列を含まない行を返します:

grep-rv'nginx'/etc/nginx

A terminal showing Grep's invert flag that matches everything but the target string.

単語と行

Grepに特定のパターンを含むものではなく、完全な単語または行を検索させることも有用です。これは、多くの単語に共通する文字列を一致させている場合に便利です。例えば、”it”という単語を一致させると、”it”は多くの単語に見られる一般的な文字列であるため、たくさんの偽陽性が返されてしまいます。

これを修正するには、Grepを-wフラグを付けて、マッチさせたい単語を続けて実行します:

cat it.txt |grep-w it

A terminal showing the whole word matching flag for Grep.

パターンを含むすべての単語を印刷するのではなく、Grepは単語自体だけを印刷します。同様のことは、フルラインの場合に-xフラグでも行いますので、設定ファイル内のフレーズや単一行を探す際にも非常に役立ちます。

Grep出力に行番号を追加

行番号は、プログラムのデバッグやテキストの校正に重要な役割を果たします。特定の関数や文の位置を正確に参照できるようにし、修正や修整が迅速に行えます。

この点において、Grepはデフォルト出力に行番号を印刷する機能を備えています。これを行うには、マッチさせたい文字列を続けて-nフラグを付けてプログラムを実行します:

grep-n main ./my-code.c

UNIXパイプを利用すると、Grepの出力を変更して、探している内容の行番号だけを印刷することもできます。これにより、大きなテキストを解析するのがはるかに簡潔で容易になります:

grep-n Sed essay.txt |cut-f1-d :

FYI: UNIXパイプはGrepのためのツール以上のものです。SSHパイプを作成してリモートシェル作業を自動化する方法を学びましょう。

Grepで拡張正規表現を使用

Grepは、テキスト文字列を一致させたりフィルターをかけたりするために、基本正規表現(BRE)メタキャラクタセットを使用します。これがほとんどの作業には機能しますが、パターングループで作業しているときに制限を感じるユーザーもいるかもしれません。

これに対処するために、ほとんどのGrep実装は-Eフラグを提供し、このフラグを使用することでプログラムが拡張正規表現(ERE)メタキャラクタを解析できるようになります。例えば、次のコマンドは-Eフラグでのみ機能します:

printf"hello\nhellooooo\n"|grep-E .*o{2}$

注: GNU版のGrepは、デフォルトで一部のERE機能を使用します。しかし、他のUNIX系システムとの互換性を保持するために、EREを使用する際は-Eを使用することが良い習慣です。

さらに、GrepにはすべてのRegex機能を排除する特別なモードもあります。これを使用するには、-Fフラグを付けてプログラムを実行します:

grep-F[MakeTechEasier] ./fixed.txt

Grep出力に隣接行を追加

Grepの主な強みの1つは、ファイルや入力ストリーム内でテキストがどこに現れるかを示すことです。ただし、文字列の正確な位置を知っているだけでは、問題をトラブルシューティングする際に役立たない場合があります。例えば、クラッシュログは通常、従来の”Segmentation Fault”メッセージを出力する前の追加のコンテキストを提供します。

この問題を解決する1つの方法は、Grepを-Cフラグで実行して、対象のテキストの周囲に印刷したい行数を指定することです。次のコマンドは、対象のテキストマッチの前後5行を印刷します:

grep-C5'Hello' ./hello-sample.txt

A terminal showing Grep's ability to print the surrounding context of a target string.

Grepがマッチ前やマッチ後のコンテキストのどちらを印刷するかをカスタマイズすることもできます。例えば、次のコマンドは、対象の文字列の後の前の10行を印刷します:

grep-A10'Hello' ./hello-sample.txt

A terminal showing Grep printing the next 10 lines after its initial string match.

Grepの基本と日常の作業における使用法を理解したので、コマンドラインとコアUNIXユーティリティの理解に向けての第一歩を踏み出しました。Linuxでsedがどのように機能するかを学ぶことで、この非常に多様で深い世界をさらに探求してください。

Image credit: Alejandro Escamilla via Unsplash. All alterations and screenshots by Ramces Red.