grep と正規表現を用いた検索の例をいくつか紹介します.前節 26.2.1 grep とは? に引き続きサンプルファイル nobelprize.txt を使いますので,以下の説明を読む前にダウンロードを済ませておいてください.また正規表現の文法については 26.1.2 正規表現の文法 で説明していますので,こちらと見比べながら例を見ると良いでしょう.
例 1: 受賞者が複数いる年を探す
nobelprize.txt を眺めると,複数人の受賞者がいる年は受賞者の名前がカンマ , で区切って並べられていることが分かります.一方,受賞者が 1 人しかいない年に対応する行には当然カンマが現れません.ですのでカンマを検索すれば,複数人の受賞者がいる年を検索できます.
例 2: 受賞者が 1 人のみの年を探す
grep に -v オプションをつけると,検索結果にマッチしない行を出力させることができます.よって例 1 に -v を書き足すだけで,受賞者が 1 人のみの年が探せます.
例 3: 受賞者が 3 人いる年を探す
カンマを検索すれば受賞者の数が複数かどうかは分かりますが,受賞者が 2 人か 3 人かどうかまでは分かりません.これを判断するには,行に含まれているカンマの個数を調べる必要があります.3 人の受賞者がいる行は
年号 1 人目の名前, 2 人目の名前, 3 人目の名前
という格好をしています.この形の行を検索するには
- まずカンマがあり
- カンマの直後に任意の文字列があり
- 続けてもう 1 個カンマがある
という条件を指定すれば OK です.これに対応する正規表現は ,.+, となります.ただし grep では,1 文字以上の繰り返しを表すプラス + は \+ のようにエスケープしなければいけません.
例 4: 1990 年代の受賞者一覧を表示させる
1990 年から 1999 年までの受賞者を全て表示するには,1990, 1991, …, 1999 のいずれかにマッチする行を検索します.0 から 9 のいずれかにマッチするパターンは [0-9] ですので,199[0-9] で検索すれば 1990 から 1999 までの全てにマッチさせることができます.