grepの使い方

grepの使い方(I)

grepは次の形式に従って,指定したファイルfilenameに対してパターン/pattern/のパターンマッチを行う.


% grep pattern filename

filenameとして複数のファイル名を指定すると,それらのファイルを対象に処理を行う.

パターンに正規表現を使わなくてもgrepは有用である. 以下の例では,検索対象となるファイル群があると思われるディレクトリにワーキングディレクトリを移動しているとする. そうでなければ,検索ファイル(群)の指定には目的とするディレクトリまでのディレクトリパスも指定する必要がある.

たとえば,パターンマッチのターゲットとするファイルcopyingに対して,次のようにgrepを使う.

  1. ターゲットとするファイルcopying.txtに対して,パターン/programs/を指定すると,このパターンを含む行(4行)を返しているのである(grepでパターン/pattern/を指定するときには,記号『/』は省いてpatternだけを指定する). パターンとして/program/とすると,ヒットする行は26行になってしまう!.
    
    % grep programs copying.txt
    your programs, too.
    in new free programs; and that you know you can do these things.
    programs whose distribution conditions are different, write to the author
    proprietary programs.  If your program is a subroutine library, you may
    
    
  2. ターゲットとするファイル指定を*.txtとして 拡張子『.txt』の付くすべてのファイルとすることができる.
    
    % grep programs *.txt
    copying.txt: your programs, too.
    copying.txt: in new free programs; and that you know you can do these things.
    copying.txt: programs whose distribution conditions are different, write to the author
    copying.txt: proprietary programs.  If your program is a subroutine library, you may
    apple.txt: application. Now here is an AppleScript programs that accomplishes the same task
    
    

    このときには,ファイル名の後にマッチしたパターンを含む行を表示する.

grepの使い方(II)

filenameで指定するファイルからデータを入力せずに,他のコマンドからの出力をパイプしてフィルタとして次のような形でgrepを使うことができる.


% 他のコマンドからの出力 | grep pattern

たとえば,マッチした総行数を表示するオプション「-c」を付けて調べると,ファイルcopying.txtにはパターン/the/を含む行を169行あることが分かる.


% grep -c the copying.txt
169

パターン/the/を含む169行の中から,さらにパターン/programs/を含む行を抜き出すには,最初のgrepの結果をパイプしてさらにgrepに渡してやると,次のように2行を得ることができる.


% grep the copying.txt | grep programs
in new free programs; and that you know you can do these things.
programs whose distribution conditions are different, write to the author

grepの主なオプション

grepには次のようにオプションoptionを指定することができる.


% grep option pattern filename

 

オプション 意味
-c マッチした総行数の表示
-i 大文字小文字を区別しない
-n 行番号をつけて表示
-v 指定したパターンを含まない行だけを表示
-l(エル) 指定したパターンを含むファイル名だけを表示

 

  • マッチした行が何行かを表示するには,次のようにオプション-cを付ける.
    
    % grep -c Apple target.txt
    
    

    演習:オプション-cを使わないで,マッチした総行数を表示するには,フィルタwcをオプションを付けてパイプする.

  • パターン/APPLE/,/apple/などにもマッチするように,大文字・小文字の区別をしないて検索するには,次のようにオプション-iを付ける.
    
    % grep -i Apple target.txt
    
    
  • オプションの重複.大小文字の区別をせずにマッチした総行数を表示するには,次のように2つのオプションを指定する.
    
    % grep -ic Apple target.txt
    

grepで使える正規表現

patternには,次の表の正規表現を使うことができる. ただし,パターンが正規表現のときには『…….』と引用符で囲む.

 

grepで使われる正規表現
意味
c メタ文字でない文字”c”はその文字自身を表す
\m メタ文字”m”のその文字自身を表す
^(ハット) 行頭を表す
$ 行末を表す
.(ピリオド) 任意の1文字を表す
[c1c2….cn] 文字集合c1c2…cnの中の任意の1文字
[c1-c2] c1からc2までの文字範囲の中の任意の1文字
[^c1c2…cn] c1c2…cnのどれでもない任意の1文字
r* 正規表現rの0回以上の繰り返しを表す
r1r2 正規表現r1に正規表現r2が続く並びを表す
\(r\) タグ付き正規表現r(正規表現のグループ化)を表す
\N N番目のタグ付き表現がマッチした文字列を表す.

 

  • 検索パターンを工夫して目指すパターンを含む行を探し出すためには,正規表現を利用すると便利である. たとえば,行頭でAppleを含む行を表示するには,次のようにする.
    
    % grep '^Apple' target.txt
    
    

    正規表現をパターンとするときには,引用符『』で囲んでいることに注意する(シェルにエスケープ記号などを解釈されないようにするため).

  • apple juice,apple banana juiceやapple strawberry juiceのようにappleで始まりjuiceで終わるパターンを含んだ行にマッチさせたいときには次のようにする.
    
    % grep 'apple * juice' target.txt
    
    
  • 正規表現についての知識がない場合でも,他のフィルタにパイプして行を絞り込むことは可能である. たとえば,次のようにgrepした結果をさらにgrepでパイプするという「洗練されていない」方法も考えられる.
    
    % grep apple target.txt | grep juice
    
    

    このときには,パターン/apple/と/juice/を含む行が得られるが,残念ながらその`順番’(appleが先でjuiceが後)までは指定できていない. しかし,これでも十分な場合もある.

    grepで使えるメタ文字

    grepで使えるメタ文字(meta characters)は次の7つである.

    
    \    ^    $    .    [    ]    *
    
    

    メタ文字を`文字’として指定するためには,上の正規表現の表にあるように,記号『\』を付けてメタ文字の意味をエスケープ(escape)する. この意味で,メタ文字をエスケープ記号ということがある.

    • LaTeXファイルで現れるパターン/\title/をマッチさせるには,grepのメタ記号「\」をエスケープするために,『\\』をパターンに含める. たとえば,LaTeX文書群の表題(\title{…})を知るためには
      
      % grep '\\title{' *.tex
      
      

      とする. \\titleとせずに\\title{としているのは,\maketitleを含む行が表示されるのを避けるためである.