GREP(1)

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

書式
grep [ -[[AB] ] num ] [ -[CEFGVBchilnsvwx] ] [ -e ] pattern | -ffile ] [ files... ]

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

grep は、次のオプションにより大きく 3 つの動作に分かれます。
-G  パターンとして、基本的な正規表現を扱うモード。デフォルトです。
-E  拡張された正規表現を扱うモードです。ただし、本 grep は、基本の正 規表現と、拡張の正規表現には、表記上の違いはありますが、機能的には差は ありません。
-F  パターンとして改行で区切られた固定の文字列パターンのリストを扱 うモードです。
egrep と fgrep は、grep にリンクを張ったもので、実体は grep です。grep を egrep の名前で起動した時の動作は、 grep -E とほぼ同じです。ただし、古い UNIX の egrep との互換のため、完全に同じではあ りません。 grep を fgrep の名前で起動した場合は、 grep -F と同じです。

その他のオプションは以下のものがあります。
-num
    num で指定した行数だけ、パターンにマッチした行の前後の行もそれぞれ表示します。
-A num
    num で指定した行数だけ、パターンにマッチした行の後の行も表示します。
-B num
    num で指定した行数だけ、パターンにマッチした行の前の行も表示します。
-C  -2 を指定した事と同じで、パターンにマッチした行の前後 2 行も表示します。
-V  grep のバージョン番号を標準エラー出力に表示します。バグレポート には、この番号を付記してください。
-b  各行の前に、ファイルの先頭からバイト単位のオフセットを表示します。
-n    各行の前に、行番号を表示します。
-c  各行の表示はせず、マッチした行数だけを表示します。 -v オプションと共に指定した場合は、マッチしなかった行数の表示となります。
-e pattern
    パターンを指定します。パターンの先頭が、 - で始まっているなど、オプションの指定と混同される可能性がある時に有効です。 通常は、 -e を省略してパターンを記述する事ができます。
-f file
    パターンを file から読み込みます。
-h  複数のファイルを指定した場合、デフォルトでは、マッチした行の前 に、ファイル名を付けて表示が行われますが、 -h を指定した場合は、ファイル名を付けないようにします。
-i  パターンマッチにおいて、英大文字と小文字の区別をしないようにします。
-l  通常の表示を抑止し、代わりに、パターンにマッチしたファイルのファ イル名を 1 行ずつ表示します。 -v と共に使用した場合は、マッチしなかったファイル名の表示になります。
-L  通常の表示を抑止し、代わりに、パターンにマッチしなかったファイル名を表示 します。 -lv と同じです。
-q  通常の表示を抑止します。
-s  指定されたファイルが存在しない場合や、読み込みできなかった時、 デフォルトではエラーメッセージを表示しますが、これを抑止します。
-v  指定されたパターンにマッチしない行を対象にします。
-w  パターンマッチを、単語全体で行うようにします。デフォルトの動 作では、指定されたパターンが行の中のどの部分にマッチしてもかまいません が、 -w を指定した場合は、単語単位となります。 単語とは、アルファベット、数字およびア ンダースコアーからなる文字列で、その前後は、空白など、単語を構成しない 文字や、行頭、行末などで区切られたものです。 そして、行の中の各単語について、単語を構成する文字全てがパター ンとマッチするかどうか調べます。
-x  パターンマッチを、行全体で行うようにします。

正規表現

grep は、基本的な正規表現と 古い UNIX の egrep に相当する拡張正規表現の 2 種 類の正規表現を扱う事ができます。ただし、本 grep (GNU プロダクトの grep) では、どちらの表現も機能的に違いありません。他のインプリメントでは、基 本正規表現は、拡張正規表現より制限があるようになっていますが、本 grep で は、表記上の違いだけです。ここでは、拡張正規表現について説明し、基本正 規表現との違いはその後に説明します。

正規表現の基本単位は、単一の文字にマッチします。アルファベットや数字な どの多くの文字は、それ自身にマッチします。また、特殊な意味のある文字も、 バックスラッシュ`\'を付ける事で、その本来の文字にマッチするようになり ます。 例えば 0 は 0 にマッチし、 \[ は [ にマッチします。

[ と ] で囲まれた文字のリストは、そのリストの中に含まれる文字のどれか にとマッチすることができます。ただし、リストの先頭に ^ を書いた場合は、そのリストに含まれ ない 文字にマッチします。 例えば、 [0123456789] は数字 1 文字にマッチします。 [^0123456789] は数字以外の 1 文字にマッチします。

2 つの文字の間に `-' を付けることで、前後 2 つの文字の ASCII キャラクタコー ドの間にある文字全体を指定することができます。 例えば、 [0-9] は数字 1 文字にマッチします。 [:クラス名:]で、特定の文字クラスを指定することができます。クラスには、 [:alnum:], [:alpha:], [:cntrl:], [:digit:], [:graph:], [:lower:], [:print:], [:punct:], [:space:], [:upper:], [:xdigit:] があります。 例えば、 [[:alnum:]] は [0-9A-Za-z] と同じですが、 [:alnum:] で指定した方が ASCII コード順に依存しません。

リストの中では、ほとんどの特殊文字は、通常の文字として扱われます。 また、次の文字も、リストの中の位置によっては、通常の文字として扱われます。

]   リストの先頭にあれば、] にマッチ

^   リストの先頭以外にあれば、^ にマッチ

-   リストの最後にあれば、- にマッチ

例えば、[][] は ] か [ にマッチします。

次の表現は、特殊な意味があります。

.   任意の 1 文字にマッチ

\w  [[:alnum:]] と同じで、アルファベットと数字にマッチ

\W  [^[:alnum:]] と同じで、アルファベットと数字以外にマッチ

^   行の先頭にマッチ

$   行の最後にマッチ

\<  単語の先頭にマッチ

\>  単語の最後にマッチ

\b  単語の端にマッチ

\B  単語の端 以外 にマッチ

次の表現は、他の正規表現を修飾します。拡張正規表現です。
?   他の正規表現の後に指定し、0 回か 1 回マッチさせます。マッチしない場 合も一致とします。
*   他の正規表現の後に指定し、0 回以上マッチさせます。マッチしない場合も 一致とします。
+   他の正規表現の後に指定し、その正規表現を 1 回以上マッチさせます。 なお、少なくとも 1 回はマッチしなくてはいけません。
{n} 他の正規表現の後に指定し、厳密に n 回マッチさせます。
{n,}
    他の正規表現の後に指定し、 n 回以上マッチさせます。
{,m}
    他の正規表現の後に指定し、 m 回以下でマッチさせます。
{n,m}
    他の正規表現の後に指定し、 n 回以上 m 回以下でマッチさせます。
|   2 つの正規表現の間に指定し、どちらか一方がマッチすれば一致とします。
()  括弧でくくった正規表現をひとまとまりでマッチさせます。繰り返しなどの 修飾は、このまとまりに対しての指定になります。
\n  括弧で括った正規表現のまとまりは、出て来た順番に番号が振られており、 そのうちの n 番目のものを繰り返します。 例えば、taro|hanako は `taro' か `hanako' にマッチします。 `su(momo)mo\1mo\1nouti' は `sumomomomomomomomonouti' にマッチします

基本正規表現では、 ?, +, {, |, (, ) は、正規表現としての特殊な意味は 持たず、その文字本来のパターンにマッチします。代わりに、 \?, \+, \{, \|, \(, \) を使う事で、拡張正規表現と同じ機能を持ちまます。

egrep として起動した場合、 { は、正規表現としての特殊な意味は持ちません。

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

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