GREP(1)

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

書式
grep [options] PATTERN [FILE...]
grep [options] [-e PATTERN | -f FILE] [FILE...]

解説
grep は、 FILE で名前を指定された入力ファイル (ファイルが指定されてないか、 FILE の部分に - が指定された場合は標準入力) を読み込み、与えられた PATTERN にマッチする部分を含む行を探します。 デフォルト動作では、 grep はマッチした行を表示します。

さらに、2 つのプログラム egrep と fgrep を利用可能です。 egrep は grep -E と同じです。 fgrep は grep -F と同じです。 zgrep は grep -Z と同じです。 zegrep は grep -EZ と同じです。 zfgrep は grep -FZ と同じです。

オプション

-A NUM, --after-context=NUM
    NUM で指定した行数だけ、パターンにマッチした行の後の行も表示します。 マッチしたグループの間には、 -- を含む行を挿入します。

-a, --text
    バイナリファイルをテキストファイルであるかのように処理します。 これは --binary-files=text オプションと等価です。

-B NUM, --before-context=NUM
    NUM で指定した行数だけ、パターンにマッチした行の前の行も表示します。 マッチしたグループの間には、 -- を含む行を挿入します。

-C NUM, --context=NUM
    NUM で指定した行数だけ、パターンにマッチした行の前後の行も表示します。 マッチしたグループの間には、 -- を含む行を挿入します。

-b, --byte-offset
    各出力行の前に、入力ファイルの先頭からのバイト単位のオフセットを表示します。

--binary-files=TYPE
    ファイルの最初の数バイトが、 ファイルの内容がバイナリファイルであることを示す場合、 ファイルのタイプを TYPE であると仮定します。 デフォルトでは TYPE は binary であり、 grep は通常、バイナリファイルの一致を示す一行メッセージを表示するか、 マッチしない場合にはなにも表示しません。 TYPE が without-match の場合、 grep はバイナリファイルはマッチしないものと仮定します。 これは -I オプションと等価です。 TYPE が text の場合、 grep はバイナリファイルをテキストであるかのように扱います。 これは -a オプションと等価です。 警告: grep --binary-files=text はバイナリのゴミを表示する可能性があります。 出力先が端末である場合で、 端末ドライバがこのゴミの一部をコマンドであると解釈する場合、 このゴミが悪い副作用をおよぼす可能性があります。

--colour[=WHEN], --color[=WHEN]
    マッチした文字列を GREP_COLOR 環境変数でで指定されたマーカで囲みます。 WHEN は、`never' または `always'、`auto' のどれかです。

-c, --count
    通常の出力はせず、各入力ファイルについてマッチした行数を表示します。 -v, --invert-match オプションと共に指定した場合は、 マッチしなかった行数を表示します (下記参照)。

-D ACTION, --devices=ACTION
    入力ファイルがデバイス、FIFO もしくはソケットの場合、 ACTION を使ってその処理を行います デフォルトでは ACTION は read であり、デバイスが通常ファイルであるかのように読み取る事を意味します。 ACTION が skip なら、デバイスを黙って読み飛ばします。

-d ACTION, --directories=ACTION
    入力ファイルがディレクトリの場合に、 ACTION を使ってその処理を行います。デフォルトでは ACTION は read であり、ディレクトリを普通のファイルであるかの様に読み取る事を意味します。 ACTION が skip なら、ディレクトリを黙って読み飛ばします。 ACTION が recurse なら、 grep は各ディレクトリ下のすべてのファイルを再帰的に読み取ります。 これは -r オプションと等価です。

-E, --extended-regexp
    PATTERN を拡張された正規表現として扱います (下記参照)。

-e PATTERN, --regexp=PATTERN
    PATTERN をパターンとして指定します。 - で始まるパターンを保護するために有効です。

-F, --fixed-strings
    PATTERN を改行で区切られた固定文字列のリストとして扱います。 その文字列のどれかとマッチするかを調べます。

-P, --perl-regexp
    PATTERN を Perl の正規表現として解釈します。

-f FILE, --file=FILE
    パターンを FILE から 1 行ごとに読み込みます。 空のファイルはパターンを含まないので、何にもマッチしません。

-G, --basic-regexp
    PATTERN を基本的な正規表現として扱います (下記参照)。デフォルトです。

-H, --with-filename
    各々のマッチに対してファイル名を表示します。

-h, --no-filename
    複数ファイルを検索した時に、出力の前にファイル名を付けることを抑制します。

--help
    簡単なヘルプメッセージを出力します。

-I  バイナリファイルをマッチするデータを含まないかのように処理します。これは --binary-files=without-match オプションと等価です。

-i, --ignore-case
    PATTERN と入力ファイルの双方で、英大文字と小文字の区別をしないようにします。

-L, --files-without-match
    通常の出力はせず、 このオプションを指定しなかったときに 全く出力されない入力ファイルの名前を表示します。 スキャン動作は最初のマッチで終了します。

-l, --files-with-matches
    通常の出力はせず、 このオプションを指定しなかったときに 出力される入力ファイルの名前を表示します。 スキャン動作は最初のマッチで終了します。

-m NUM, --max-count=NUM
    NUM 個のマッチした行のあと、ファイルの読み取りを停止します。 もし、通常ファイルから標準入力を介して入力が行われており、 NUM 個のマッチした行が出力だった場合、 その後に続くコンテキスト行があるかどうかに関わらず、 grep は、終了する前に標準入力が最後にマッチした行の直後に位置される事を保証します。 これによって、呼び出したプロセスが検索を再開する事が可能となります。 NUM 個のマッチした行の後に停止した場合、 grep は、その後に続くコンテキスト行を出力します。 -c や --count オプションも指定された場合、 grep は NUM より大きな行数を出力しません。 -v や --invert-match オプションも指定された場合、 grep は NUM 個のマッチしない行の出力後に停止します。

--mmap
    可能ならば、デフォルトの read(2) システムコールの代わりに mmap(2) システムコールを使って入力を読み取ります。 ある状況において、 --mmap はよりよい性能をもたらします。 しかし、 grep の動作中に入力ファイルが小さくなるか、または I/O エラーが生じた場合に、 --mmap は (コアダンプを含む) 未定義の動作を引き起こす可能性があります。

-n, --line-number
    各出力行の前に、入力ファイルにおける行番号を表示します。

-o, --only-matching
    マッチした行の PATTERN にマッチした部分のみを表示します。

--label=LABEL
    実際には標準入力からの入力を、ファイル LABEL からの入力として表示します。 これは zgrep などのツールに対して、特に便利です。 例: gzip -cd foo.gz |grep --label=foo something

--line-buffered
    行ごとに出力をおこないます。 これはパフォーマンスが悪くなる事があります。

-q, --quiet, --silent
    沈黙: 標準出力には何も出力しません。 何かマッチした場合、エラーが起きた時でも直ちに返り値 0 で終了します。 -s や --no-messages オプションも参照。

-R, -r, --recursive
    各ディレクトリ下のすべてのファイルを再帰的に読み取ります。 これは -d recurse オプションと等価です。

--include=PATTERN
    PATTERN にマッチするファイルのみを検索しながら、ディレクトリを再帰します。

--exclude=PATTERN
    PATTERN にマッチするファイルを読み飛ばしながら、ディレクトリを再帰します。

-s, --no-messages
    指定されたファイルが存在しないことや読み込みできないことを示す エラーメッセージを抑止します。 移植性に関する注: GNU grep とは異なり、 伝統的な grep は POSIX.2 に適合していませんでした。なぜなら、伝統的な grep には -q オプションが無く、 -s オプションは GNU grep の -q オプションの様に動作したからです。 伝統的な grep へ移植可能であることを意図したシェルスクリプトは、 -q と -s を両方とも使わずに、出力を /dev/null へリダイレクトすべきです。

-U, --binary
    ファイルをバイナリとして扱います。デフォルトでは、MS-DOS と MS-Windows 環境下で grep は、ファイルから読み取った最初の 32KB の内容を見て、ファイルタイプを推測します。 grep はファイルをテキストファイルと判断した場合、オリジナルのファイル内容から ( ^ と $ が使われている正規表現を正しく動作させるために ) CR 文字を取り除きます。 -U を指定すると、この当て推量を抑制し、すべてのファイルを読み取って マッチ機構へそのまま渡します。もしファイルが 各行の末尾に CR/LF の組みを持つテキストファイルなら、 このオプションは正規表現を役に立たなくさせることがあるでしょう。 このオプションは MS-DOS と MS-Windows 以外のプラットフォームでは 効果がありません。

-u, --unix-byte-offsets
    unix 形式のバイト単位オフセットを報告します。このスイッチを指定すると grep は、ファイルが unix 形式のテキストファイル、 すなわち、 CR 文字が取り除かれたファイルであるかのごとくに バイト単位オフセットを報告します。 このことは grep を Unix マシンで動作させたのと同じ結果を生成します。 このオプションは -b オプションも使用しない限り効果がありません。 MS-DOS と MS-Windows 以外のプラットフォームでは効果がありません。

-V, --version
    grep のバージョン番号を標準エラー出力に表示します。バグレポート には、この番号を付記してください (下記参照)。

-v, --invert-match
    結果を反転し、マッチしなかった行を選択します。

-w, --word-regexp
    完全な語にマッチする行のみを選択します。 マッチする部分文字列が行頭から始まっているか、 単語構成文字以外の文字が前にあることがテストされます。 同様に、マッチする部分文字列が行末まであるか、 単語構成文字以外の文字が後にある必要があります。 単語構成文字とは、レター・数字・アンダスコアです。

-x, --line-regexp
    行全体と正確にマッチする行のみを選択します。

-y  -i と同じ意味を持つ旧式のオプションです。

--null
    通常ファイル名の後に続く文字の代わりにバイト 0 (ASCII NUL 文字) を出力します。 例えば、 grep -l --null は各ファイル名の後に、通常の newline ではなくバイト 0 を出力します。 このオプションを指定すると、 newline 等の例外的な文字を含むファイル名に直面した場合でも 出力が明白になります。 このオプションを find -print0, perl -0, sort -z, xargs -0 等のコマンドと共に使用すれば、任意のファイル名を処理できます。 ファイル名が newline 文字を含んでいても処理可能です。

-Z, --decompress
    検索を開始する前に入力データを伸長します。 このオプションは zlib(3) ライブラリと共にコンパイルした場合のみ使用可能です。 -J, --bz2decompress 検索を開始する前に入力データを bzip2(1) を使用して伸長します。

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

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

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

角括弧式 は、 [ と ] で囲まれた文字のリストです。 これは、そのリスト中に含まれるどれか 1 文字にマッチします。 ただし、リストの先頭がキャレット ^ の場合は、そのリストに含まれ ない 文字にマッチします。 例えば、正規表現 [0123456789] は数字 1 文字にマッチします。

角括弧式内で、 範囲式 はハイフンで分けられた 2 文字で構成されます。 これは、ロケールの照合順序や文字集合を用いて、 この 2 文字を含み、この間に並ぶ 1 文字にマッチするものです。 例えば、デフォルトの C ロケールでは、 [a-d] は [abcd] と等価です。 多くのロケールでは文字を辞書順に並べており、そのようなロケールでは、 [a-d] は一般的に [abcd] と等価ではなく、例えば [aBbCcDd] と等価かもしれません。 角括弧式の古典的な解釈を使用するには、 LC_ALL 環境変数に値 C を設定し、C ロケールを使用してください。

最後に、特定の名前を持つ文字クラスが、角括弧式にて 以下のようにあらかじめ定義されています。 [:alnum:], [:alpha:], [:cntrl:], [:digit:], [:graph:], [:lower:], [:print:], [:punct:], [:space:], [:upper:], [:xdigit:] 例えば、 [[:alnum:]] は [0-9A-Za-z], と同じですが、後者が C ロケールや ASCII 文字符号化に 依存するのに対して、前者はロケールや文字集合に依存しません。 (クラス名の中の角括弧はシンボル名の一部であり、 リストを区切る角括弧とは別に指定する必要があることに注意) リストの中では、ほとんどのメタ文字は通常の文字として扱われます。 リテラル ] を含めるには、この文字をリストの先頭に置いてください。同様に、リテラル ^ を含めるには、この文字をリストの先頭以外に置いてください。リテラル - を含めるには、この文字をリストの最後に置いてください。

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

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

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

2 つの正規表現は結合可能です。 結果としてできあがる正規表現は、 結合された 2 つの部分表現にそれぞれマッチする 2 つの部分文字列を結合した任意の文字列にマッチします。

2 つの正規表現は中置き型演算子 | で繋ぐことが可能です。 結果としてできあがる正規表現は、 どちらかの部分表現にマッチする任意の文字列にマッチします。

繰り返しは結合に優先します。また結合は選択に優先します。 これらの優先規則を無効とするために、 部分表現全体を括弧で囲むことが可能です。

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

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

伝統的な egrep は、メタ文字 { をサポートしませんでした。また、このメタ文字の代わりに \{ をサポートする egrep 実装もいくつか存在するので、移植可能なスクリプトでは、 リテラル { にマッチさせるために egrep パターンで { を使うことは避けて [{] を使うべきです。

GNU egrep は、 { が不正な範囲指定の始まりであるなら特殊文字ではない、と想定して、 伝統的な使用法のサポートを試みます。 例えば、シェルコマンド egrep '{1' は正規表現の文法エラーを報告せずに、2 文字の文字列 {1 を検索します。 POSIX.2 は、この動作を一つの拡張として許可していますが、 移植可能なスクリプトではこの使用法を避けるべきです。

環境変数
grep の動作は、以下の環境変数によって影響を受けます。

ロケール LC_foo は、以下の 3 つの環境変数 LC_ALL, LC_foo, LANG がこの順番で検査される事によって、指定されます。 これらの変数の中で最初に設定されていたものによって、ロケールが指定されます。 例えば、 LC_ALL が設定されておらず、 LC_MESSAGES が pt_BR に設定されていた場合、 ブラジルのポルトガル語が LC_MESSAGES ロケールに対して使用されます。 これらの環境変数がどれも設定されていなかったり、 もしくはロケールのカタログがインストールされていなかったり、 また grep が各国語サポート (NLS) なしでコンパイルされていた場合、 C ロケールが使用されます。

GREP_OPTIONS
    この変数は明示的なオプションの前に指定されるデフォルトオプションを 指定します。例えば、もし GREP_OPTIONS が '--binary-files=without-match --directories=skip' である場合、 grep は 2 つのオプション --binary-files=without-match と --directories=skip が明示的なオプションの前に指定されている様に動作します。 オプションの指定は空白によって区切られます。 バックスラッシュは次の文字をエスケープします。 これは空白やバックスラッシュを含むオプションを指定するために用いられます。

GREP_COLOR
    ハイライトするマーカを指定します。

LC_ALL, LC_COLLATE, LANG
    これらの変数は、 [a-z] のような範囲式を解釈する際の参照順序を決定する LC_COLLATE を指定します。

LC_ALL, LC_CTYPE, LANG
    これらの変数は、 例えばどの文字が空白であるかなど、文字の種類を決定する LC_CTYPE を指定します。

LC_ALL, LC_MESSAGES, LANG
    これらの変数は、 grep の出すメッセージの言語を決定する LC_MESSAGES を指定します。 デフォルトの C ロケールは、アメリカ英語のメッセージを使用します。

POSIXLY_CORRECT
    設定されている場合、 grep は POSIX.2 として動作し、それ以外の場合は grep は他の GNU プログラムのように動作します。 POSIX.2 ではファイル名の後に続くオプションは ファイル名として扱われます。 デフォルトでは、このようなオプションはオペランドリストの先頭に 並び変えられて、オプションとして扱われます。 また、POSIX.2 では認識できないオプションは “ 不法 (illegal)” であると診断されますが、 法律に違反しているわけではないので、 デフォルトではこれらは“不正 (invalid)” であると診断されます。

診断

通常、選択された行が見つかった場合は 0 を、 見つからなかった場合は 1 を返します。 エラーが生じた場合 2 を返しますが、 -q や --quiet 、 --silent オプションが指定されており、選択された行が見つかった場合は、 その限りではありません。

バグ
バグレポートは、 bug-gnu-utils@gnu.org まで Email してください。 この時、“Subject:” のどこかに “grep” という単語を 忘れずに入れてください。

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

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