26.2.2. 検索例
grep と正規表現を用いた検索の例をいくつか紹介します。前節 26.2.1. grep とは? に引き続きサンプルファイル nobelprize.txt を使いますので、以下の説明を読む前にダウンロードを済ませておいてください。また正規表現の文法については 26.1.2. 正規表現の文法 で説明していますので、こちらと見比べながら例を見ると良いでしょう。
例 1: 受賞者が複数いる年を探す #
nobelprize.txt を眺めると、複数人の受賞者がいる年は受賞者の名前がカンマ , で区切って並べられていることが分かります。一方、受賞者が 1 人しかいない年に対応する行には当然カンマが現れません。ですのでカンマを検索すれば、複数人の受賞者がいる年を検索できます。
grep “,” nobelprize.txt
2011 Saul Perlmutter, Brian P. Schmidt, Adam G. Riess 2010 Andre Geim, Konstantin Novoselov 2009 Charles Kuen Kao, Willard S. Boyle, George E. Smith 2008 Yoichiro Nambu, Makoto Kobayashi, Toshihide Maskawa …
例 2: 受賞者が 1 人のみの年を探す #
grep に -v オプションをつけると、検索結果にマッチしない行を出力させることができます。よって例 1 に -v を書き足すだけで、受賞者が 1 人のみの年が探せます。
grep -v “,” nobelprize.txt
1992 Georges Charpak 1991 Pierre-Gilles de Gennes 1985 Klaus von Klitzing 1982 Kenneth G. Wilson …
例 3: 受賞者が 3 人いる年を探す #
カンマを検索すれば受賞者の数が複数かどうかは分かりますが、受賞者が 2 人か 3 人かどうかまでは分かりません。これを判断するには、行に含まれているカンマの個数を調べる必要があります。3 人の受賞者がいる行は
年号 1 人目の名前, 2 人目の名前, 3 人目の名前
という格好をしています。この形の行を検索するには
- まずカンマがあり
- カンマの直後に任意の文字列があり
- 続けてもう 1 個カンマがある
という条件を指定すれば OK です。これに対応する正規表現は ,.+, となります。ただし grep では、1 文字以上の繰り返しを表すプラス + は + のようにエスケープしなければいけません。
grep “,.+,” nobelprize.txt
2011 Saul Perlmutter, Brian P. Schmidt, Adam G. Riess 2009 Charles Kuen Kao, Willard S. Boyle, George E. Smith 2008 Yoichiro Nambu, Makoto Kobayashi, Toshihide Maskawa 2005 Roy J. Glauber, John L. Hall, Theodor W. Hänsch …
例 4: 1990 年代の受賞者一覧を表示させる #
1990 年から 1999 年までの受賞者を全て表示するには、1990, 1991, …, 1999 のいずれかにマッチする行を検索します。0 から 9 のいずれかにマッチするパターンは [0-9] ですので、199[0-9] で検索すれば 1990 から 1999 までの全てにマッチさせることができます。
grep “199[0-9]” nobelprize.txt
1999 Gerardus ’t Hooft, Martinus J.G. Veltman 1998 Robert B. Laughlin, Horst L. Störmer, Daniel C. Tsui 1997 Steven Chu, Claude Cohen-Tannoudji, William D. Phillips 1996 David M. Lee, Douglas D. Osheroff, Robert C. Richardson …