26.2.1 grep とは?

grep とは,ターミナル上で走る文字列検索のためのプログラムです.grep にテキストファイルと検索したい文字列や正規表現パターンを渡すと,grep はファイルを 1 行ずつ調べ,条件にマッチする行を出力します.

まずはとにかく使ってみましょう.実験用のファイルとして,次の nobelprize.txt を使います.リンクを右クリックし,ファイルを適当なところにダウンロードしてください.

nobelprize.txt

このテキストファイルには,1900 年から 2011 年までのノーベル物理学賞受賞者の一覧が年ごとに分かれて入っています.

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
...

ファイルをダウンロードしたらターミナルを立ち上げ,cd コマンドで nobelprize.txt を置いたディレクトリに移動してください (ターミナルの使い方は hwb15. コマンド を参照してください).その後,たとえば grep Curie nobelprize.txt と入力すると,nobelprize.txt の中で Curie を含む行が出力されます.

grep Curie nobelprize.txtreturn2
1903 Antoine Henri Becquerel, Pierre Curie, Marie Curie, née Sklodowska

Pierre Curie, Marie Curie は夫婦でノーベル賞を受賞しましたが,2 人で同じ年に受賞したので検索結果は 1 行しか出てきません.今度は名前に Paul を含む人を検索してみましょう.

grep Paul nobelprize.txtreturn2
1989 Norman F. Ramsey, Hans G. Dehmelt, Wolfgang Paul 1963 Eugene Paul Wigner, Maria Goeppert Mayer, J. Hans D. Jensen 1945 Wolfgang Pauli 1933 Erwin Schrödinger, Paul Adrien Maurice Dirac

ちゃんと検索できたように見えますが,1945 年のところを良く見ると Wolfgang Pauli がヒットしています.Pauli ではなく Paul だけをヒットさせるには「Paul の後ろに i が来ない」という条件を付け加えれば大丈夫です.この条件は [^i] という正規表現で実現できます.grep で正規表現を使うには -e オプションをつける必要があるので,次のようにコマンドを打ちます.

grep -e "Paul[^i]" nobelprize.txtreturn2
1989 Norman F. Ramsey, Hans G. Dehmelt, Wolfgang Paul 1963 Eugene Paul Wigner, Maria Goeppert Mayer, J. Hans D. Jensen 1933 Erwin Schrödinger, Paul Adrien Maurice Dirac

なお 1989 年に受賞した Wolfgang Paul と 1945 年に受賞した Wolfgang Pauli は名前がそっくりさんですが,もちろん別人です.ノーベル財団のウェブサイトに載っている externalWolfgang Paul, externalWolfgang Pauli それぞれの紹介を見れば分かりますが,生まれた国も違えば専門分野も違います.もっとも 2 人が生きた年代はそんなに違いませんから,ひょっとしたらお互いに面識はあったのかもしれません.

何はともあれ,こうして簡単な検索ができました.次の節では,もっと詳しい検索のしかたの例をお見せします.