テキスト検索ユーティリティ: GREP.EXE

提供: RAD Studio
移動先: 案内検索

コマンドライン ユーティリティ:インデックス への移動


GREP(Global Regular Expression Print)は、同名の UNIX ユーティリティに由来する強力なテキスト検索プログラムです。 GREP は、1 つ以上のファイルまたは標準入力ストリームに含まれるテキスト パターンを検索します。

GREP の使い方

ここで、GREP を使用するとよい状況の簡単な例を紹介しましょう。 Bob という文字列が含まれているテキスト ファイルをカレント ディレクトリ内で見つけたいとしましょう。 この場合、次のように入力すればよいでしょう。

grep Bob *.txt

GREP は、各ファイルに Bob という文字列が含まれていれば、その行のリストを返します。 GREP では大文字と小文字の区別はデフォルトでは無視されないため、文字列 bobboB は一致しません。

GREP では、単一固定文字列のマッチングにとどまらず、多くの処理を行えます。 特定のパターンに一致する文字列を GREP で検索することができます (このトピックの「検索文字列」節を参照)。


コマンドライン構文

GREP の一般的なコマンドライン構文は以下のとおりです。

grep [-<options>] <searchstring> [<files(s)>...]


コマンドライン要素

オプション 説明
<options>

GREP の動作を変更するもので、1 つ以上の文字で構成され、先頭にハイフン(-)が付きます。

<searchstring>

検索するパターンを指定します。

<file(s)>

検索対象となるファイルを GREP に指示します ファイル名は、明示的に指定するか、?* といったワイルドカードを組み込んた汎用的な名前で指定できます。 また、パス(ドライブやディレクトリ情報)も入力できます。 パスを指定せずにファイル名を並べると、GREP はカレント ディレクトリを検索します。
ファイルを指定しない場合、GREP は標準入力を検索します。 これにより、パイプ(縦棒 |)やリダイレクト("より大" 記号 >)を使用することができます。


GREP のコマンドライン オプション、特殊文字、デフォルトの一覧を表示するには、次のように入力します。

grep ?

コマンドライン オプション

1 文字の前にハイフン(-)を付けたものを 1 つ以上指定することで、コマンドラインで GREP ユーティリティにオプションを渡すことができます。 個々の文字は、オン/オフできるスイッチです。 文字の後にプラス記号(+)を付けるとオプションがオンになり、ハイフン(-)を付けるとオプションがオフになります。 + 記号は省略可能です。たとえば、-r-r+ と同じ意味になります。
-i -d -l のように複数のオプションを 1 つ 1 つ並べることもできますし、-ild または -il-d のように全部または一部を 1 つにまとめることもできます。

GREP では、以下の表に示すコマンドライン オプションをサポートしています。

GREP のコマンドライン オプション

オプション 説明
?

GREP のオプション、特殊文字、デフォルトを示すヘルプ画面を表示します。

-c-

出現数のカウントのみ: 一致する行の数を出力するだけです。 GREP は、一致する行が少なくとも 1 つ含まれるファイルごとに、ファイル名および一致する行の数を出力します。 一致する行そのものは出力されません。
このオプションはデフォルトではオフです。

-d-

サブディレクトリを検索: コマンドラインで指定されたファイルごとに、GREP は、指定されたディレクトリとその中のすべてのサブディレクトリから、指定された条件に一致するファイルをすべて検索します。 パスを付けずにファイルを指定した場合、GREP はそのファイルがカレント ディレクトリにあるものと仮定します。
このオプションはデフォルトではオフです。

-e

検索表現を次に指定: 次に来る引数が検索表現であることを示します。 このオプションは、- で始まる表現を検索する場合に有効です。

-i-

大文字と小文字の区別を無視: GREP は大文字/小文字の違いを無視します。 このオプションがオンの場合、GREP はあらゆる状況で、a から z までのすべての文字を A から Z までの対応する文字と同一とみなします。
このオプションはデフォルトではオフです。

-l-

ファイル名の一覧のみ: 一致する文字列を含む各ファイルの名前のみ出力します。 一致する文字列が GREP で見つかったら、そのファイル名が出力されたあと、ただちに次のファイルに処理が進みます。
このオプションはデフォルトではオフです。

-n-

行番号を出力: GREP で出力される各一致行の先頭に行番号が付きます。
このオプションはデフォルトではオフです。

-o-

UNIX 形式で出力: 一致行の出力形式を、UNIX スタイルのコマンドライン パイプ処理をサポートしやすいように変更します。 出力のすべての行の先頭に、一致行が含まれているファイルの名前が付きます。
このオプションはデフォルトではオフです。

-r+

正規表現による検索: 検索文字列で定義されたテキストは、リテラル文字列ではなく、正規表現として扱われます。
このオプションはデフォルトではオンです。
正規表現は、1 つ以上の文字(状況に応じて引用符で囲まれることがある)が 1 回以上現れたものです。
以下の記号は特別な扱いをされます(詳細は、このトピックの「 特殊文字」節を参照)。

  • ^ -- 行頭
  • . -- 任意の文字
  • * -- ゼロ個以上の文字に一致
  • [aeiou0-9] -- a、e、i、o、u、および 0-9 に一致
  • [^aeiou0-9] -- a、e、i、o、u、および 0-9 以外のあらゆるものに一致
  • $ -- 行末
  • \ -- 次の文字をエスケープする(普通の文字として扱う)
  • + -- 1 個以上の文字に一致
-u <filename>

オプションの更新: GREP.EXE のコピーを <ファイル名>.EXE という名前で作成します。 コマンドラインに含まれているオプションはすべて、GREP の新しいコピーにデフォルトとして保存されます。 オプションのデフォルト設定をカスタマイズする場合に、-u オプションを使用します。 デフォルトが正しく設定されたかどうかを確認するには、
「<ファイル名> ?」と入力します。
ヘルプ画面に表示された各オプションの後ろには + または - が付けられ、そのデフォルト設定を示します。

-v-

不一致のみ: 一致しない行のみ出力します。 検索文字列が含まれていない行のみ、不一致行とみなされます。
このオプションはデフォルトではオフです。

-w-

単語の検索: 正規表現に一致するテキストの直前および直後の文字が単語の一部でない場合にのみ、一致とみなされます。 単語を構成する文字はデフォルトでは、AZ09、および下線(_)です。
このオプションはデフォルトではオフです。
このオプションには、単語を構成する有効な文字の集合を指定できる形式もあります。 -w[set] という形式です([set] は任意の有効な正規表現)。
アルファベット文字でこの集合を定義した場合は、その集合内の文字ごとに(どう入力したかによらず)大文字と小文字が両方とも集合に含まれるように自動的に定義されます。これは、検索で大文字と小文字が区別される場合にも当てはまります。
-w オプションを -u オプションと組み合わせて使用すると、有効な文字の新しい集合がデフォルト集合として保存されます。

-z-

詳細表示: GREP は、検索されたファイルごとにファイル名を出力します。 各一致行の先頭にはその行番号が付きます。 各ファイル内の一致行の数も出力されます(ゼロの場合でも)。
このオプションはデフォルトではオフです。

検索文字列

<検索文字列> の値は、GREP で検索するパターンを定義します。 検索文字列は、正規表現でもリテラル文字列でもかまいません。

  • 正規表現では、ある特定の文字が特別な意味を持っています。つまり、それらは検索を規定する演算子なのです (正規表現は、単一の文字か、文字の集合を角かっこで囲んだものです。 正規表現を連結したものも正規表現になります)。
  • リテラル文字列には、演算子はありません。つまり、各文字はそのままの文字として扱われます。

検索文字列を引用符で囲むことで、空白やタブが区切り記号として扱われないようにすることができます。 - で始まる表現を検索するには、-e オプションを使用します。 検索文字列に一致するテキストは行の境界をまたぐことはできません。つまり、パターンに一致するのに必要なテキストはすべて、1 行に収まっていなければなりません。

-r オプション(デフォルトでオン)を使用すると、検索文字列は(リテラル表現ではなく)正規表現として扱われます。

特殊文字

以下の文字は特別な意味を持っています。

記号 説明
^

表現の先頭に曲折アクセント記号(^)があると、それは行頭に一致します。

$

表現の末尾にドル記号があると、それは行末に一致します。

.

ピリオドは、任意の 1 文字に一致します。

*

文字の後にアスタリスクがあると、その文字が任意の数現れたあと任意の文字がゼロ個以上現れるものに一致します。 たとえば、bo*botboo のほか、bo にも一致します。

+

文字の後にプラス記号があると、その文字が任意の数現れたあと任意の文字が 1 個以上現れるものに一致します。 たとえば、bo+botboo には一致しますが、bbobt には一致しません。

{}

複数の文字や表現を中かっこで囲むと、それらはグループ化されるため、検索パターンの評価を制御できるほか、グループ化されたテキストは番号で参照できるようになります。

[]

複数の文字を角かっこで囲むと、そのかっこ内に現れる任意の 1 文字にのみ一致します。 たとえば、[bot]bot のいずれかに一致します。

[^]

角かっこ内の文字列の先頭に曲折アクセント記号(^)があると、それは否定を意味します。 したがって [^bot] は、bo、および t 以外の任意の文字に一致します。

[-]

角かっこ内のハイフンは、文字の範囲を示します。 たとえば、[b-o]b から o までの任意の 1 文字に一致します。

\

ワイルドカード文字の前にバックスラッシュ(日本語環境では \)が付くと、GREP は、その文字をワイルドカードではなくそのままの文字として扱います。 たとえば \^^ という文字に一致し、行頭は検索されません。


4 つの "特殊" 文字($.*+)は、角かっこで囲まれた文字集合の一部として使用された場合、特別な意味は持ちません。 さらに、文字 ^ は、文字集合定義の先頭(区切り記号 [ の直後)に現れる場合にのみ特別な扱いをされます。

GREP の例

例 1 -- GREP の出力をリダイレクトする

GREP の結果が 1 画面に収まらないほど長い場合は、その出力をファイルにリダイレクトすることができます。

たとえば、次のようなコマンドを使用することもできます。

GREP "Bob" *.txt > temp.txt

このコマンドは、カレント ディレクトリ内で txt 拡張子の付いたファイルをすべて検索し、その結果を temp.txt というファイルに書き込みます(このファイルには好きな名前を付けることができます)。 任意のテキスト エディタやワード プロセッサを使用して temp.txt の内容(検索結果)を確認することができます。

例 2

grep -r "[^a-z]main\ *\(" *.c

一致するもの:

main(i,j:integer)
if (main ()) halt;
if (MAIN ()) halt;

一致しないもの:

mymain()

解説: 検索文字列は、"小文字が前に付いていない([^a-z])単語 "main" の後ろにゼロ個以上の空白(\ *)が現れたあと左かっこが続く" ものを検索するように、GREP に指示しています。 空白やタブは通常、コマンドラインの区切り記号とみなされるため、それらを正規表現の一部に含める場合は、それらをエスケープする必要があります。

例 3

grep -ri [a-c]:\\data\.fil *.c *.inc

一致するもの:

A:\data.fil
B:\DATA.FIL
c:\Data.Fil

一致しないもの:

d:\data.fil a:data.fil

解説: バックスラッシュ文字(日本語環境では \)やピリオド文字(.)は通常、パス名やファイル名において特別な意味を持っているため、それらを検索する場合はそれらの直前にエスケープ文字を付ける必要があります。 ここでは -i オプションが使用されているので、検索では大文字と小文字が区別されません。

例 4

grep "search string with spaces" *.doc *.c

一致するもの:

A search string with spaces in it.

一致しないもの:

This search string has spaces in it.

解説: これは、特定のテキストが含まれている文字列を検索する方法の例です。

例 5

grep -rd "[ ,.:?'\"]"$ \*.doc

一致するもの:

He said hi to me.
Where are you going?
In anticipation of a unique situation,
Examples include the following:
"Many men smoke, but fu man chu."

一致しないもの:

He said "Hi" to me
Where are you going? I'm headed to the

解説: この例では、「" . : ? ',」のうちの任意の 1 文字が行末にあるものを検索しています。 文字範囲に含める二重引用符については、文字列の終わりを表す二重引用符としてではなく通常の文字として扱われるように、前にエスケープ文字を付けます。 さらに、引用符で囲まれた文字列の外に $ 文字が付いています。 これは、正規表現を連結してより長い表現にする方法の例を示しています。

例 6

grep -w[=] = *.c

一致するもの:

i = 5;
j=5;
i += j;

一致しないもの:

if (i == t) j++;
/* ==================================== */

この例では、単語を構成する文字の現在の集合を再定義して代入演算子(=)のみとした後、単語の検索を行っています。 その結果、等号(=)を 1 つだけ使用する C の代入文には一致しますが、二重等号(==)を使用する等値検査には一致しません。

関連項目