GREP(1)

名称
grep, egrep, fgrep, zgrep - パターンにマッチする行を表示する

書式
grep [-[AB] num] [-HRPS] [-CEFGLVabchilnqsvwx] [-e expr] [-f file] files...

解説
grep は、 files で名前を指定されたファイル (ファイルが指定されてないか files の部分に - が指定された場合は標準入力) を読み込み、 pattern で指定したパターンにマッチする部分を含んでいるかどうかを、行毎に調べます。 デフォルト動作では、マッチした行を表示します。

grep は、以下のオプションにより大きく 3 つの動作に分かれます。
-G  pattern として、基本的な正規表現を扱うモードです (下記参照)。デフォルトです。
-E  pattern として、拡張された正規表現を扱うモードです (下記参照)。
-F  pattern として、改行で区切られた固定の文字列パターンのリストを扱うモードです。 その文字列のどれかにマッチするかどうか調べます。
さらに、2 つの同種のプログラム egrep と fgrep が利用可能です。 egrep は、 grep -E と似ています (が等価ではありません) し、歴史的な UNIX の egrep と互換性があります。 fgrep は、 grep -F と同じです。 zgrep として呼ばれた場合には、 -Z オプションが仮定されます。

全ての grep の変種は、以下のようなオプションを理解します:
-num
    num で指定した行数だけ、パターンにマッチした行の前後の行も表示します。 ただし、同じ行を 2 度以上表示する事はありません。
-A num
    num で指定した行数だけ、パターンにマッチした行の後の行も表示します。
-B num
    num で指定した行数だけ、パターンにマッチした行の前の行も表示します。
-C  -2 を指定した事と同じです。
-V  grep のバージョン番号を標準エラー出力に表示します。バグレポート には、この番号を付記してください (下記参照)。
-a  バイナリファイルの検索を行いません。
-b  各行の前に、ファイルの先頭からのバイト単位のオフセットを表示します。
-c  各行の表示はせず、マッチした行数だけを表示します。 -v オプションと共に指定した場合は、 マッチしなかった行数の表示となります (下記参照)。
-e pattern
    パターンを指定します。 - で始まっているパターンを保護するために有効です。
-f file
    パターンを file から読み込みます。
-h  複数ファイルを検索した時に、出力の前にファイル名を付けることを抑制します。
-i  パターンマッチにおいて、英大文字と小文字の区別をしないようにします。
-L  通常の表示を抑止します; このオプションを指定しなかったときに 全く出力されない入力ファイルの名前を表示します。
-l  通常の表示を抑止します; このオプションを指定しなかったときに 出力される入力ファイルの名前を表示します。
-n  各行の出力の前に、入力ファイルにおける行番号を表示します。
-q  静粛; 通常の表示を抑止します。
-s  指定されたファイルが存在しないことや読み込みできないことを示す エラーメッセージを抑止します。
-v  マッチの意味を逆転します。すなわち、マッチしない行を対象にします。
-w  完全な語にマッチする行のみを選択します。 部分文字列が行頭から始まっているか、 語でない文字列が前にあることがテストされます。 同様に、行末か語でない文字列が後に付いいる必要があります。 単語とは、レター・数字・アンダスコアからなる文字列です。
-x  行全体がマッチする行のみを選択します。
FTS ライブラリとともにコンパイルした場合、以下のオプションが 利用可能です:
-H  -R オプション指定時に、 コマンドラインのシンボリックリンクを辿ります (木を探索している時に遭遇したシンボリックリンクは辿りません) 。
-L  -R オプション指定時に、全てのシンボリックリンクを辿ります。
-P  -R オプション指定時に、シンボリックリンクを辿りません。
-R  ファイルのみを検索する代わりに、ファイルを根とするファイル階層を検索します。
次のオプションは zlib ライブラリと共にコンパイルした場合のみ使用可能です:
-Z  -Z オプションが指定されると、検索前に入力ファイルを伸長します。

正規表現

正規表現は、文字列の集合を表現するパターンの事です。正規表現は、より小さな
    表現を組み合わせるさまざまな演算子を用いる事により、数式表現と同じような 表現を作成する事ができます。

grep は、「基本」正規表現と 「拡張」正規表現の 2 種類の正規表現を扱う事ができます。 GNU grep では、どちらの表現も機能的に違いありません。 他の実装では、基本正規表現は拡張正規表現より能力が低くなっています。 ここでは、拡張正規表現について説明します。 基本正規表現との違いは、その後に説明します。

正規表現の基本単位は、1 文字にマッチします。 レターや数字などの多くの文字は、それ自身にマッチします。 また、特殊な意味があるメタ文字も、その文字の前にバックスラッシュ を付ける事で、その本来の文字にマッチするようになります。

[ と ] で囲まれた文字のリストは、そのリストの中に含まれるどれか 1 文字にマッチします。 ただし、リストの先頭がキャレット ^ の場合は、そのリストに含まれ ない 文字にマッチします。 例えば、正規表現 [0123456789] は数字 1 文字にマッチします。 ASCII 文字の範囲は最初と最後の文字をハイフン (`-') でつなぐことで 指定できます。最後に、特定の名前を持つ文字クラスが既定義されています。 名前が内容を示しており、それらは、 [:alnum:], [:alpha:], [:cntrl:], [:digit:], [:graph:], [:lower:], [:print:], [:punct:], [:space:], [:upper:], [:xdigit:] です。 例えば、 [[:alnum:]] は [0-9A-Za-z] と同じですが、後者は ASCII コード順に依存しますので、前者の方が可搬的です。 (注: クラス名の鈎括弧はシンボル名の一部であり、 リストを区切る鈎括弧とは別に指定する必要があります。) リストの中では、ほとんどの特殊文字は、通常の文字として扱われます。 リテラル ] を含むためにはリストの先頭に置いてください。同様に、リテラル ^ を含むためには先頭以外に置いてください。リテラル - を含むためには、最後に置いてください。

ピリオド . は、任意の 1 文字にマッチします。 シンボル \w は、 [[:alnum:]] と同じで、 シンボル \W は、 [^[:alnum:]] と同じです。

キャレット ^ と、 ドル記号 $ は、それぞれ行頭と行末の空文字列にマッチするメタ文字です。 シンボル \< とシンボル \> は、それぞれ単語の先頭と単語の末尾の空文字列にマッチするメタ文字です。 シンボル \b は単語の端の空文字列にマッチします。 シンボル \B は単語の端 以外 の空文字列にマッチします。

1 文字にマッチする正規表現の後には、繰り返し演算子が付くことがあります:
?   直前の項目はオプションであり、最大 1 回マッチします。
*   直前の項目は 0 回以上マッチします。
+   直前の項目は 1 回以上マッチします。
{n} 直前の項目は厳密に n 回マッチします。
{n,}
    直前の項目は n 回以上マッチします。
{,m}
    直前の項目はオプションであり、最大 m 回マッチします。
{n,m}
    直前の項目は、最低 n 回、最大 m 回マッチします。

2 つの正規表現は結合可能です; 結果としてできあがる正規表現は、 結合された 2 つの部分表現にそれぞれマッチする 2 つの部分文字列を結合した任意の文字列にマッチします。 2 つの正規表現は | インフィクス演算子で繋ぐことができます; 結果としてできあがる正規表現は、 どちらかの部分表現にマッチする任意の文字列にマッチします。

繰り返しは結合に優先します。また結合は選言に優先します。 部分表現全体は括弧で括って、この順序に優先させることができます。

n が 1 つの数字であるような、 後方参照 \n は、正規表現中で括弧で囲まれた n 番目の部分表現にマッチします。

基本正規表現では、メタ文字 ?, +, {, |, (, ) は、特殊な意味を失います; 代わりに、バックスラッシュを付けた \?, \+, \{, \|, \(, \) を使用してください。

egrep では、 { は、特殊な意味を失います; 代わりに、 \{ を使う必要があります。

診断
通常、パターンにマッチした行が見つかった場合は 0 を、 見つからなかった場合は 1 を返します。(ただし、 -v オプションを指定した場合は、逆になります。) パターンの指定の仕方が間違っていたり、ファイルがアクセスできないなどの エラーが発生した場合は、2 を返します。

バグ
バグレポートは、 bug-gnu-utils@prep.ai.mit.edu まで Email してください。この時、``Subject:'' のどこにでもいいですから ``grep'' という単語を 忘れずに入れてください。

{m,n} の表現で非常に大きな繰り返しを指定すると、非常に多くのメモリを消費します。 さらに、ある種のあいまいな正規表現を指定すると、必要となる時間とメモリ領域は 指数的に増大し、メモリ不足を起こす可能性があります。

後方参照は非常に動作が遅く、必要となる時間は指数的に増大します。