Node:Top, Up:(dir)
grep, print lines matching a pattern

Top


Node:Introduction, Next:, Previous:Top, Up:Top

はじめに

grepは,与えられたパターンリストに一致するものを含む行を,入力 ファイルで検索します.行の中に一致しているものが見つかるとき,(デフォル トで)標準出力,または,オプションで要求したあらゆる他の出力にコピーしま す.

grepは,テキストでの一致を期待しますが,利用可能なメモリ以外に 入力行の長さの制限はなく,行の任意の文字に一致可能です.入力ファイルの最 後のバイトが改行では無い場合,grepは暗黙にそれを付加します.改 行は,パターンリストのセパレータでもあるので,テキストの改行文字に一致す る方法はありません。


Node:Invoking, Next:, Previous:Introduction, Up:Top

grepの呼び出し

grepは,POSIX.2GNUの拡張の,豊富なオプションセット を持っています.


-c
--count
標準的な出力を抑制します.代わりに,それぞれの入力ファイルに対し,一致し た行数を出力します.-v--revert-matchオプションと併用した 場合,一致しない行を数えます.
-e pattern
--regexp=pattern
patternをパターンとして使います.-で始まるパターンの保護に 役立ちます.
-f file
--file=file
1行毎に,fileからパターンを得ます.空のファイルは,0個のパターンを 含むので,何にも一致しません.
-i
--ignore-case
パターンと入力ファイルの両方で,大文字小文字の違いを無視します.
-l
--files-with-matches
標準的な出力を抑制します.通常出力されている,それぞれの入力ファイルの名 前を,代わりに出力します.全てのファイルの走査は,最初に一致すると停止し ます.
-n
--line-number
入力ファイルの行番号を,それぞれの出力行の前に置きます.
-q
--quiet
--silent
静かを意味します.通常の出力を抑制します.全てのファイルのスキャンは,最 初に一致すると停止します.-s--no-messagesオプションも参 照してください.
-s
--no-messages
存在しない,あるいは読み込みできないファイルについての,エラーメッセージ を抑制します.移植性のメモ: 伝統的なgrepは,-qオプショ ンが無く,-sオプションは,GNU grep-qオプ ションのように動作するので,伝統的なgrepは,GNU grepと異なり,POSIX.2準拠ではありません.伝統的な grepとの移植性を考慮するシェルスクリプトは,-q-sを避け,代わりに/dev/nullに,出力をリダイレクトするべき です.
-v
--invert-match
一致するという意味を反転し,一致しない行を選択します.
-x
--line-regexp
正確に行全体が一致したもののみを選択します.

GNUの拡張


-A num
--after-context=num
一致した行の後に,後ろの文脈をnum行出力します.
-B num
--before-context=num
一致した行の前に,前の文脈をnum行出力します.
-C num
--context=[num]
出力文脈の前後の(デフォルトで2)行を出力します.
-num
--context=numと同様に,前後の行を出力します.しかし, grepは,与えられた行を,一度以上出力しません.
-V
--version
grepのバージョンナンバーを標準出力に出力します.このバージョン ナンバーをすべてのバグレポートに含めてください.
--help
これらのコマンドラインオプションの概要の簡単な使用法メッセージと,バグレ ポートのアドレスを出力して終了します.
--binary-files=type
ファイルの最初の数バイトで,ファイルがバイナリデータを含むことを示してい る場合,ファイルの形式がtypeであると考えます.デフォルトで, typebinaryで,grepは通常,バイナリファイルが一 致したことを告げる1行のメッセージの出力する,または,一致しない場合はな にもメッセージを出力しないのどちらかです.typewithout-matchの場合,grepはバイナリファイルは一致しない と考えます.これは-Iオプションと同じです.typetext の場合,grepはバイナリファイルをテキストであるかのように処理し ます.これは-aオプションと同じです.警告: --binary-files=textは,端末に出力されるバイナリのゴミを出力する可 能性があり,出力が端末で,且つ端末ドライバがそれをコマンドとして解釈した 場合,それは厄介な副作用となるはずです.
-b
--byte-offset
それぞれの出力行の前に,入力ファイルのバイトオフセットを出力します. MS-DOSやMS-Windowsでgrepを実行するときは, -u(--unix-byte-offsets)オプションが使われているかどうかに 依存して,バイトオフセットを出力します.以下を参照してください.
-d action
--directories=action
入力ファイルがディレクトリの場合,それを処理するために,actionを使 います.デフォルトでactionreadで,それは,ディレクトリが 普通のファイルであるかのように読まれることを意味します(オペレーティング システムとファイルシステムによってはこれができないものもあり, grepは全てのディレクトリに対しエラーメッセージを出力します). actionskipの場合,ディレクトリは暗黙にスキップされます. actionrecurseの場合,grepはそれぞれのディレクト リ下の全てのファイルを再帰的に読み込みます.これは,-rオプション と同じです.
-H
--with-filename
それぞれの一致に対し,ファイル名を出力します.
-h
--no-filename
複数のファイルが検索されているとき,出力の前のファイル名を抑制します.
-L
--files-without-match
標準的な出力を抑制します.通常,出力されないそれぞれの入力ファイル名 1を,代わりに出力 します.全てのファイルのスキャンは,最初に一致すると停止します.
-a
--text
バイナリファイルをテキストファイルであるかのように処理します.これは, --binary-files=textオプションと同じです.
-I
バイナリファイルを,一致データを含まないものとして処理します.これは --binary-files=without-matchオプションと同じです.
-w
--word-regexp
単語全体が一致しているものを含む行のみを選択します.一致しているサブ文字 列が,行の最初,または,単語を構成しない文字が前にあるかのどうかを調べま す.同様に,行の最後,または,単語を構成しない文字が後に続くかどうかを調 べます.単語を構成する文字は,文字,数字と,アンダースコアです.
-r
--recursive
コマンド行にあるそれぞれのディレクトリに対し,そのディレクトリの全てのファ イルを再帰的に読み込み処理します.これは,-d recurseオプションと 同じです.
-y
-iに対する時代遅れの同義語です.
-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 文字を無視します.これは,Unixマシンでgrepを実行するのと同じ結 果を生成します.このオプションは,-bオプションと一緒に使用しない 限り効果がありません.MS-DOSとMS-Windows以外のプラットホームでは効 果がありません.
--mmap
可能な場合,入力を読む際,デフォルトのreadシステムコールの代わり に,mmapシステムコールを使用します.--mmapが,良いパフォー マンスを与える場合もあります.しかし,grep処理中に入力ファイル が小さくなる場合や,I/Oエラーが生じた場合,--mmapは,(coreの吐き 出しを含め)未定義の動作をすることもあります.
-Z
--null
通常ファイル名に続く文字の代わりに,0バイト(ASCIINUL文字) を出力します.例えば,grep -lZは,それぞれのファイル名の後,通常 の改行の代わりに,0バイトを出力します.このオプションは,ファイル名が改 行のような普通でない文字を含む場合でも出力を曖昧にしません.このオプショ ンは,改行文字を含むような任意のファイル名を処理するとき使用する, find -print0perl -0sort -zxargs -0のよ うなコマンドとともに使用されます.
-z
--null-data
それぞれの行は,改行の代わりに0バイト(ASCIINUL文字)で終端 され,入力を1行として扱います.-Z--nullオプションのよう に,このオプションは,任意のファイル名を処理する際のsort -zのよう なコマンドとともに使用されます.

grep一致エンジンの変形を使用するかどうかを制御する,追加のオ プションもあります.See Grep Programs.

環境変数

grepの動作は,以下の環境変数に影響されます.


GREP_OPTIONS
この変数は,あらゆる明確なオプションの前に置く,デフォルトオプションを指 定します.例えば,GREP_OPTIONS--binary-files=without-match --directories=skip の場合, grepは,2つのオプション--binary-files=without-match--directories=skipが,明確なオプションの前に指定されているように 動作します.オプション指定は,空白で分割します.バックスラッシュは次の文 字をエスケープするので,空白やバックスラッシュを含むオプションを指定する とき使用することができます.
LC_ALL
LC_MESSAGES
LANG
これらの変数はLC_MESSAGESロケールを指定し,それは,grep がメッセージで使用する言語を決定します.ロケールは,設定されたこれらの変 数で最初に決定されます.これらの環境変数が設定されていない場合や,メッセー ジカタログがインストールされていない場合や,grepが国際言語サポー ト(NLS)でコンパイルされていない場合,アメリカ英語が使用されます.
LC_ALL
LC_CTYPE
LANG
これらの変数はLC_CTYPEロケールを指定し,それは例えば,どの文字が 空白となるかといった,文字の型を決定します.ロケールは,設定されたこれら の変数で最初に決定されます.これらの環境変数が設定されていない場合や,ロ ケールカタログがインストールされていない場合や,grepが国際言語 サポート(NLS)でコンパイルされていない場合,POSIXロケールが使用 されます.
POSIXLY_CORRECT
設定されている場合,grepは,POSIX.2で要求されているように 動作します.そうでない場合,grepは,他のGNUプログラムのよ うに動作します.POSIX.2は,ファイル名が続くオプションは,ファイル名 として扱う必要があると要求します.デフォルトで,そのようなオプションは, オペランドリストの前に順序を変え,オプションとして扱われます.また, POSIX.2は,理解できなかったオプションを「不正」と診断することも要求 しますが,本当に規則に反しているわけではないので,デフォルトでは「無効」 と診断されます.POSIXLY_CORRECTは,以下で述べる _N_GNU_nonoption_argv_flags_も使用できないようにします.
_N_GNU_nonoption_argv_flags_
(ここで,Nは,grepのプロセスID番号です.)この環境 変数の値のi番目の文字が1の場合,grepi番目 のオペランドは,明らかにそうであってもオプションと考えません.シェルは, 実行するそれぞれのコマンドに対し,この変数を環境に置くことができ,それを 指定すると,オペランドはワイルドカードを展開したファイル名の結果となり, そのため,オプションとして扱われません.この動作は,GNUCライブラリ のみで,POSIXLY_CORRECTがセットされていないときのみ利用可能です.


Node:Diagnostics, Next:, Previous:Invoking, Up:Top

診断

通常,一致したものが見つかった場合,終了ステータスは0で,一致したものが 見つからない場合,1です(-vオプションは,終了ステータスの意味が反 転します).パターン内の構文エラーや,アクセスできない入力ファイルや,他 のシステムエラーがある場合,終了ステータスは2です.


Node:Grep Programs, Next:, Previous:Diagnostics, Up:Top

grepプログラム

grepは,指名された入力ファイル(または,ファイルが指名されない 場合や,-という名前のファイルが与えられた場合は標準入力)で,与え られたパターンに一致したものを含む行を探します.デフォルトで, grepは一致した行を出力します.3つの主要なgrepの変形 があり,以下のオプションで制御されます.


-G
--basic-regexp
基本的な正規表現としてパターンを解釈します.これはデフォルトです.
-E
--extended-regexp
拡張された正規表現として,パターンを解釈します.
-F
--fixed-strings
改行で分けられた固定文字列のリストとしてパターンを解釈し,それはどれにで も一致します.

さらに,2つの変形プログラム,egrepfgrepが利用可能 です. egrepは,grep -Eと同じです.fgrepは, grep -Fと同じです.


Node:Regular Expressions, Next:, Previous:Grep Programs, Up:Top

正規表現

正規表現は,文字列のセットを記述するパターンです.正規表現は,より 小さな表現を統合する,様々なオペレータを使った算数的な表現で,同様に組み 立てられます.grepは,2つの異なるバージョンの正規表現構文," 基本"と"拡張"を理解します.GNU grepでは,どちらの構文 を使っても,利用可能な機能に違いはありません.他のインプリメンテーション では,基本正規表現はそんなに強力ではありません.以下の記述は,拡張正規表 現に当てはまります.基本正規表現との違いは,後で要約します.

基本的な構築ブロックは,一文字に一致する正規表現です.すべての文字と数字 を含むほとんどの文字は,自分自身に一致する正規表現です.特殊な意味を持つ あらゆるメタ文字は,バックスラッシュを前に置くことで引用可能です. []で囲まれた文字のリストは,リストのあらゆる一文字と一致 します.リストの最初の文字がキャレット^の場合,リストに ないあらゆる文字に一致します.例えば,正規表現 [0123456789]は,あらゆる数字に一致します.文字の範囲は,ハイフン で分けられた,最初と最後の文字を与えることで指定できます.

終りに,文字の命名されたクラスは,以下のように前もって定義されています. その解釈はLC_CTYPEロケールに依存します.以下の解釈はPOSIX ロ ケールのもので,LC_CTYPEロケールがない場合,デフォルトとなります.


[:alnum:]
英数文字: [:alpha:][:digit:]
[:alpha:]
アルファベット文字: [:lower:][:upper:]
[:blank:]
空白文字: スペースとタブ.
[:cntrl:]
コントロール文字.ASCIIでは,これらの文字は8進数コードで,000から 037までと177 (DEL)です.その他の文字セットでは,それが何であれ, 文字と同じです.
[:digit:]
数字: 0 1 2 3 4 5 6 7 8 9
[:graph:]
グラフィック文字: [:alnum:][:punct:]
[:lower:]
小文字:a b c d e f g h i j k l m n o p q r s t u v w x y z
[:print:]
Printable characters: 印刷可能な文字: [:alnum:][:punct:],そしてスペース.
[:punct:]
句読点文字:! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~
[:space:]
スペース文字: タブ,改行,垂直タブ,フォームフィード,キャリッジリター ン,そしてスペース.
[:upper:]
大文字: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z.
[:xdigit:]
16進数: 0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f.
例えば,[[:alnum:]][0-9A-Za-z]を意味しますが,後者の書式 は,POSIXロケールとASCII文字の符号化に依存し,前者はロケールと 文字セットに依存しません.(これらのクラス名のカッコはジンボル名の一部で, 追加時には,カッコのリストを範囲を定めるカッコを含める必要があることに注 意してください).ほとんどのメタ文字は,リスト内で特殊な意味を失います. リテラル]を含めるため,それをリストの最初に置いてください.同様に, リテラル^を含めるため,最初以外の場所に置いてください.終りに,リ テラル-を含めるため,最後に置いてください.

ピリオド.はあらゆる一文字に一致します.シンボル\w[[:alnum:]]の同義語で,\W[^[:alnum]]の同義語です.

キャレット^と ドル記号$は,それぞれ,行の最初と最後の空の 文字列に一致するメタ文字です.シンボル\<\>は,それぞれ, 単語の最初と最後の空の文字列に一致します.\bは,単語の端の空の文 字列に一致し,\Bは,単語の端ではない,空の文字列に一致します.

正規表現は,繰り返しオペレーターの1つを続けることができます.


?
前のアイテムはオプションで,1回以下に一致します.
*
前のアイテムの0回以上に一致します.
+
前のアイテムの1回以上に一致します.
{n}
前のアイテムの,正確にn回に一致します.
{n,}
前のアイテムのn回以上に一致します.
{n,m}
前のアイテムの,最低n回以上,m回以下に一致します.

2つの正規表現は連結できます.その結果の正規表現は,それぞれ連結されたサ ブ表現に一致する,2つのサブ文字列を連結した形式の,あらゆる文字列に一致 します.

2つの正規表現は,インフィクスオペレータ|で連結することができます. その結果の正規表現は,サブ表現のどちらかに一致する,あらゆる文字列に一致 します.

繰り返しは連結に優先し,それは交互に優先されます.これらの優先規則に優 先させるため,サブ表現全体を丸カッコで囲むことができます.

前方参照\nは,nが一桁の場合,丸カッコで囲われている正 規表現のサブ表現を,前でn番目に一致した,サブ文字列に一致します 2

基本的な正規表現で,メタ文字?+{|(と,)は,特別な意味を失います.代わりに,バックスラッシュ バージョンの\?\+\{\|\(と, \)を使ってください.

伝統的なegrepは,メタ文字{をサポートしておらず, \{をサポートするegrepのインプリメントもあります.その ため,移植可能なスクリプトでは,egrepのパターンで{を避け, リテラル{に一致する[{]を使うべきです.

GNU egrepは,無効な間隔の指定で始まる場合,{は特 別でないものとして,伝統的な使用のサポートを試みます.例えば,シェルコマ ンドegrep '{1'は,正規表現の構文エラーを報告する代わりに,2文字 の文字列{1を検索します.POSIX.2は,拡張としてのこの動作を許 可しますが,移植可能なスクリプトでは避けるべきです.


Node:Usage, Next:, Previous:Regular Expressions, Up:Top

使用法

ここに,GNU grepを呼び出す,シェルコマンドの例があります.

grep -i 'hello.*world' menu.h main.c

これは,menu.hmain.cで,文字列worldが続く文字列 helloを含む,全ての行をリストアップします.これは,.*が, 行の0以上の文字に一致するためです.See Regular Expressions. -iオプションは,grepに大文字小文字を無視させ, Hello, world!に一致させます.そうしなければ一致しません. grepの呼び出し方の詳細は,See Invoking.

ここに,grepの使用法に関する,共通の質問と回答があります.

  1. 一致したファイルの名前のみリストアップするには,どうしたら良いのですか?
    grep -l 'main' *.c
    

    カレントディレクトリで,内容にmainがあるCファイルの名前をリストアッ プします.

  2. ディレクトリを再帰的に検索するには,どうしたら良いのですか?
    grep -r 'hello' /home/gigi
    

    helloを,ディレクトリ/home/gigiの下の,全てのファイルで検 索します.検索ファイルをもっと制御するために,findgrepと,xargsを使ってください.例えば,以下のコマン ドはCファイルのみを検索します.

    find /home/gigi -name '*.c' -print | xargs grep 'hello' /dev/null
    
  3. パターンが-で始まる場合,どうすれば良いのでしょうか?
    grep -e '--cut here--' *
    

    --cut here--に一致する全ての行を検索します.-eがない場合, grepは,--cut here--をオプションのリストとして,分割し ようとします.

  4. 単語の一部ではなく,単語全体を検索したいのですが?
    grep -w 'hello' *
    

    単語全体でhelloとなるもののみを検索します.Othelloには一致 しません.より制御するため,単語の最初と最後に一致する,\<\>を使ってください.例えば,以下のようにします.

    grep 'hello\>' *
    

    helloで終る単語のみを検索するので,単語Othelloに一致します.

  5. 一致した行の周りの文脈を出力するには,どうしたら良いのでしょうか?
    grep -C 2 'hello' *
    

    一致した行の周りの文を,それぞれ2行出力します.

  6. grepで強制的にファイル名を出力するにはどうしたら良いのでしょう か?

    /dev/nullを加えてください.

    grep 'eli' /etc/passwd /dev/null
    
  7. ps出力で,奇妙な正規表現をなぜ使うのですか?
    ps -ef | grep '[c]ron'
    

    パターンが角カッコなしで書かれている場合,ps出力行の cronだけでなく,ps出力のgrepにも一致します.

  8. grepは「バイナリファイルの一致」をなぜ報告するのですか?

    grepが,バイナリファイルから全ての一致をリストアッ プした場合,生成された出力はおそらく役に立たず,ディスプレイにゴミを撒き 散らすでしょう.そのため,GNU grepは,明らかなバイナリファ イルからの出力は抑制します.明らかなバイナリファイルからも,GNU grepの出力を強制させるため,-a--binary-files=textオプションを使用してください."Binary file matches"メッセージをエミュレートするため,-I--binary-files=without-matchオプションを使用してください.

  9. grep -lvは,なぜ一致しないファイル名を出力しないのですか?

    grep -lvは,1つ以上一致していない行を含む,全てのファイル名をリス トアップします.一致行がない全てのファイル名をリストアップするために, -L--files-without-matchオプションを使ってください.

  10. OR|でできますが,ANDはどうするのですか?
    grep 'paul' /etc/motd | grep 'franc,ois'
    

    paulfranc,oisの両方を含む全ての行を検索します.

  11. 標準入力とファイルの両方を,どうすると検索できますか?

    ファイル名-の指定を使用してください.

    cat /etc/passwd | grep 'alain' - /etc/motd
    


Node:Reporting Bugs, Next:, Previous:Usage, Up:Top

バグの報告

バグの報告は,bug-gnu-utils@gnu.orgに電子メールを送ってください. "Subject:"フィールドのどこかに,単語"grep"があることを確かめてくださ い.

{m,n}の大きな繰り返し回数で,grepが多くのメモリを使う 可能性があります.さらに,特定のその他の曖昧な正規表現は,指数関数的な時 間と空間を要求し,grepの実行はメモリ不足になる可能性があります. 前方参照は大変遅く,指数関数的な時間を必要とする可能性があります.


Node:Concept Index, Next:, Previous:Reporting Bugs, Up:Top

概念による索引

これは,grepコマンドとコマンドラインオプション以外の,このマニュ アルで述べられている,全ての問題の,一般的な索引です.


Node:Index, Previous:Concept Index, Up:Top

索引

これは,全てのgrepコマンド,コマンドラインオプションと,環境変 数の,アルファベット順のリストです.

Table of Contents


Footnotes

  1. 訳注:一致する行を含まないファイルという意味.

  2. 訳注:JMでの例は,「`su(momo)mo\1mo\1nouti'は, `sumomomomomomomomonouti'に一致します」となっています