コンピュータリテラシー目次


簡単なgrepの使い方

grepが使える(または使おうとする)ようになること,UNIXも便利だと思うはず.
grepはパターンマッチを行うフィルタで,標準入力からデータを受け取り,その中から,指定された文字列をパターンとして含む行を抜き出して(標準出力装置に)出力する. grepを使えば,膨大なファイル(群)の中から,必要なデータを抜き出したり,探している文字がどこにあるかを探し出すことができる.

注意

  1. grepのパターン検索はを単位として実行される. 行の中でマッチするパターンを見つけてしまえば,(その行の後にもマッチする文字列があったとしても)次の行を調べにいく (とは改行コードに挟まれた文字列のこと). 改行コードはUnix,Windows,Macintoshによって異なるので入手したファイルに関して事前に改行コード変換しておく必要がある.
    したがって,テキストを構成する行が,1つ以上の「文」から成っている『長大な行』のとき(文の終了を示す『.』や『。』の後にも,改行せずに文が続いているとき),長大な1行の中の後に続く「文」が検索対象とはならない可能性が大きくなったり,また,文に対する一括処理が困難となる. 電子メールの文などの特別な場合を除いて,LaTeX文書やHTML文書では必ず1つの「文」ごとに改行すること. また,考えもなく行頭に空白文字をいれるようなことも慎むこと.
  2. 英数字や記号は,特別な利用がない限り半角文字で入力する.
    「Apple」と「Apple」のように全角文字(漢字モード入力)と半角文字を『無節操に混在させた文書は最悪』で,情報検索の媒体としての価値がなくなってしまう. テキスト入力の際には注意すること(今ある文書はどうしよう?).

ごく簡単なgrepの利用

grepコマンドの書式は
% grep [オプション] パターン ファイル
である.

パターンとして後述する正規表現を使ってパターンマッチさせると強力な処理を行うことができるが,正規表現を使わなくてもgrepは有用である.

grepでは,一般に複数のファイルを対象とする. たとえば,ファイル名として*.txtとすれば,拡張子.txtのついたファイル群が対象となる.

grepの主なオプションは以下の通り.

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

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

演習:以下を実際に実行し,結果出力をよく「観察」せよ.

grepによって指定したパターンを含む行が多数に及ぶ場合には,次のような局面が考えられる.
主題の推測:キーワード候補
対象となるファイルは指定したパターンをキーワードとして持つ可能性があると推測できる.
パターンをさらに工夫する
探し出したい行(文書部分)をすばやく見出したいのであれば,条件を厳しくするように指定パーターンをさらに工夫する.
フィルターの追加
あるいは,さらに別のフィルターにパイプして,必要な情報を漉しとる.
検索対象となるファイル群が莫大であったり,ファイルサイズが巨大である場合(インターネット時代では,特殊な状況ではない!),こうした状態に遭遇する機会は多くその対処法が重要な情報処理技法の1つとなることに注意.

grepで使える正規表現

検索パターンを工夫して目指すパターンを含む行を探し出すためには,通常は正規表現を利用する. たとえば,行頭でAppleを含む行を表示するには,次のようにする. 記号『^』を使っていることに注意する.

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

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

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番目のタグ付き表現がマッチした文字列を表す.

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

\    ^    $    .    [    ]    *
メタ文字を普通の「文字」としてパターン内で使うためには,上の表にあるように,バックスラッシュ記号『\』を付けてメタ文字の意味をエスケープ(escape:本来の意味を逃がすの意)する. この意味で,メタ文字をエスケープ記号ということがある.

演習

課題

  1. HTML文書中のmetaタグがある行を抜き出す方法を述べよ。 ただし、単に文中にmetaと書いてある場合など、metaタグでない部分は抜き出してはならない
  2. tex文書中の章や節が書いてある行を抜き出す方法を述べよ。

コンピュータリテラシー目次
mizutani@rsch.tuis.ac.jp