検索と正規表現

テキストファイルの持つ

という性質を利用して、ファイルの中から特定のパターンを探し出し、 それが含まれる行を選択・表示することを高速に行なうことができる。

grepコマンド

grepコマンドは

% grep 検索パターン ファイル1 ファイル2...

という書式で起動して、指定したファイル全ての中から 検索パターンにマッチする行を表示する。

検索パターンは正規表現という検索専用の文法を使って 指定する。

正規表現とは

電話帳や郵便番号簿から目的のデータを探すときはどうするだろう。 おそらく先頭から1〜2文字(イニシャル)を利用して、検索ボタンなり索引を使っ て探すだろう。誰が登録されているか覚えていれば良いが、未知のものから探す のはたいへんである。また、データの先頭の文字を忘れていたり、 「サトウ」なのか「サイトウ」なのかとか、 「イカラシ」なのか「イガラシ」なのかなど、途中があやふやだったりすると 検索ではできない。

なにかを検索するときに、そのデータに含まれている文字列のパターンを 汎用的に指定する方法がある。そのうち、もっとも一般的であるものが 正規表現である。

正規表現の例

たとえば、「サトウ」と「サイトウ」どちらかを探したい場合、 正規表現では次のように検索パターンを書く。

サイ?トウ

こうすると、"サトウ" または "サイトウ" 両方にマッチするようになる。 特別な文字 ? を指定すると、「その直前の文字があっても無くても いい」という指定になる。また、別の特別な文字 [ ] を使っても、 同様の指定ができる。たとえば、

イ[カガ]ラシ

とすると、"イカラシ" でも "イガラシ" でもマッチするようになる。 特別な文字 [ ] の中に何文字か文字を列挙すると、 その中のどれかの文字が来ればいい、という指定になる。

egrepコマンドによる正規表現の実験

実際に名簿のようなデータを作って、正規表現で検索する練習をしてみよう。 最初に検索のデータとなるファイルを作っておこう。以下のような名簿データファ イル、meibo.txt を作成しよう。

サトウ ムネユキ SATOH Muneyuki	さとう胸幸  青葉台
コウエキ タロウ KOEKI Taro	公益太郎    酒田
イイモリ ハナコ IIMORI Hanako	飯森花子    飯森山
サイトウ テツヤ SAITOH Tetsuya	斎藤徹夜    白夜の国

実際に検索してみよう。本来は漢字でパターンを指定したいところだが、 漢字を指定する前に覚えなければ行けないことが色々あって面倒なので、この実験 ではローマ字でパターンを指定しよう。Unixには正規表現を使ってファイルから 特定の行を検索してくれるものとして egrep というコマンドが ある。egrep コマンドは

% egrep 正規表現 [ファイル群…]

のように起動し、0個以上の複数のファイルから「正規表現パターン」にマッ チする行だけを選んで出力してくれる。ファイルを0個指定すると、 標準入力から読み込んだデータから検索する。標準入力は 通常キーボードからの入力になるが

% コマンドその1 | egrep 正規表現

のようにパイプ(|)記号の後でegrepを起動した場合は 「コマンドその1」が出力したものが egrep の標準入力となる。

まずは検索してみよう。最初は、

どちらかを含む行を全部選んでみよう。この場合、大文字の I があっても無 くても良いので、正規表現パターンは "SAI?TOH" となる。実際にktermで 実行してみよう。C-2 でktermを選び、以下のコマンドを実行してみる。

% egrep "SAI?TOH" meibo.txt

正規表現のパターンを "" でくくっているのは、途中にある ? 記号をファイル名マッチだと思われないようにするためである。 このようにコマンドラインで正規表現パターンを指定するときは、パターンを "" または '' で必ず括るとトラブルが少ない。

実行結果は次のようになるだろう。

% egrep "SAI?TOH" meibo.txt
サトウ ムネユキ SATOH Muneyuki  さとう胸幸  青葉台
サイトウ テツヤ SAITOH Tetsuya  斎藤徹夜    白夜の国

もう少し欲張って、楽になるように検索パターンを考えよう。 パターン指定にいちいち大文字を打つのは面倒だし、もしかしたらデータファイ ルの方で Satoh と書いてしまう場合もあるので、大文字でも小文字でもどちら でもマッチするようにしてみよう。検索のときに大文字小文字を区別しないため には egrep コマンドに -i オプションを指定すれば 良い。

% egrep -i "sai?toh" meibo.txt
サトウ ムネユキ SATOH Muneyuki  さとう胸幸  青葉台
サイトウ テツヤ SAITOH Tetsuya  斎藤徹夜    白夜の国

その他正規表現には複雑なパターンを指定して高度な検索を行なう 特殊文字が存在する。これらを効果的に利用することで、たとえ1万行あるいは 10万行あるファイルでもテキストファイルであれば一瞬で検索を行なうことができる。

練習

meibo.txt にいくつか自分でデータを追加して 検索の実験を行なってみよう。


→ 発展: 正規表現の特殊文字


目次


(C)2004 OKOMA Lab. koeki-u.ac.jp