テキスト検索ユーティリティ: GREP.EXE
GREP(Global Regular Expression Print)は、同名の UNIX ユーティリティに由来する強力なテキスト検索プログラムです。 GREP は、1 つ以上のファイルまたは標準入力ストリームに含まれるテキスト パターンを検索します。
目次
GREP の使い方
ここで、GREP を使用するとよい状況の簡単な例を紹介しましょう。 Bob
という文字列が含まれているテキスト ファイルをカレント ディレクトリ内で見つけたいとしましょう。 この場合、次のように入力すればよいでしょう。
grep Bob *.txt
GREP は、各ファイルに Bob
という文字列が含まれていれば、その行のリストを返します。 GREP では大文字と小文字の区別はデフォルトでは無視されないため、文字列 bob
と boB
は一致しません。
GREP では、単一固定文字列のマッチングにとどまらず、多くの処理を行えます。 特定のパターンに一致する文字列を GREP で検索することができます (このトピックの「検索文字列」節を参照)。
コマンドライン構文
GREP の一般的なコマンドライン構文は以下のとおりです。
grep [-<options>] <searchstring> [<files(s)>...]
コマンドライン要素
オプション | 説明 |
---|---|
<options> |
GREP の動作を変更するもので、1 つ以上の文字で構成され、先頭にハイフン( |
<searchstring> |
検索するパターンを指定します。 |
<file(s)> |
検索対象となるファイルを 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 はあらゆる状況で、 |
-l- |
ファイル名の一覧のみ: 一致する文字列を含む各ファイルの名前のみ出力します。 一致する文字列が GREP で見つかったら、そのファイル名が出力されたあと、ただちに次のファイルに処理が進みます。 |
-n- |
行番号を出力: GREP で出力される各一致行の先頭に行番号が付きます。 |
-o- |
UNIX 形式で出力: 一致行の出力形式を、UNIX スタイルのコマンドライン パイプ処理をサポートしやすいように変更します。 出力のすべての行の先頭に、一致行が含まれているファイルの名前が付きます。 |
-r+ |
正規表現による検索:
|
-u <filename> |
オプションの更新: GREP.EXE のコピーを |
-v- |
不一致のみ: 一致しない行のみ出力します。 検索文字列が含まれていない行のみ、不一致行とみなされます。 |
-w- |
単語の検索: 正規表現に一致するテキストの直前および直後の文字が単語の一部でない場合にのみ、一致とみなされます。 単語を構成する文字はデフォルトでは、 |
-z- |
詳細表示: GREP は、検索されたファイルごとにファイル名を出力します。 各一致行の先頭にはその行番号が付きます。 各ファイル内の一致行の数も出力されます(ゼロの場合でも)。 |
検索文字列
<検索文字列>
の値は、GREP で検索するパターンを定義します。 検索文字列は、正規表現でもリテラル文字列でもかまいません。
- 正規表現では、ある特定の文字が特別な意味を持っています。つまり、それらは検索を規定する演算子なのです (正規表現は、単一の文字か、文字の集合を角かっこで囲んだものです。 正規表現を連結したものも正規表現になります)。
- リテラル文字列には、演算子はありません。つまり、各文字はそのままの文字として扱われます。
検索文字列を引用符で囲むことで、空白やタブが区切り記号として扱われないようにすることができます。 -
で始まる表現を検索するには、-e
オプションを使用します。 検索文字列に一致するテキストは行の境界をまたぐことはできません。つまり、パターンに一致するのに必要なテキストはすべて、1 行に収まっていなければなりません。
-r
オプション(デフォルトでオン)を使用すると、検索文字列は(リテラル表現ではなく)正規表現として扱われます。
特殊文字
以下の文字は特別な意味を持っています。
記号 | 説明 |
---|---|
^ |
表現の先頭に曲折アクセント記号(^)があると、それは行頭に一致します。 |
$ |
表現の末尾にドル記号があると、それは行末に一致します。 |
. |
ピリオドは、任意の 1 文字に一致します。 |
* |
文字の後にアスタリスクがあると、その文字が任意の数現れたあと任意の文字がゼロ個以上現れるものに一致します。 たとえば、 |
+ |
文字の後にプラス記号があると、その文字が任意の数現れたあと任意の文字が 1 個以上現れるものに一致します。 たとえば、 |
{} |
複数の文字や表現を中かっこで囲むと、それらはグループ化されるため、検索パターンの評価を制御できるほか、グループ化されたテキストは番号で参照できるようになります。 |
[] |
複数の文字を角かっこで囲むと、そのかっこ内に現れる任意の 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 の代入文には一致しますが、二重等号(==
)を使用する等値検査には一致しません。