• 20億の針

文字列検索のコマンドといえば、Unix由来のgrepが有名だ。grepコマンドは、1973年のUnix Ver.4で標準ツールとして導入された。作者は、Unixの開発者の一人Ken Thompsonである。奇妙な名前だが、テキストエディタedのコマンド「g/re/p」が元になっている。意味としては「正規表現reに一致したすべての行に対してp(Print)コマンドを実行」という意味で、動作としてはまさにgrepそのものである。ただ、edは、テキストをメモリに読み込んでから動作していたため、大きなファイルの検索には向いていなかった。このため、Thompsonがg/re/pに相当する機能を単独のプログラムにしたものがgrepである。

MS-DOSや初期の16 bit版Windowsにもテキストファイルの検索機能はあったが、正規表現をシステム側で正式にサポートしたのは、1999年のWSH 5.0からだ。Internet Explorer Ver.5.0に付属するWSH(Windows Scripting Host)に正規表現クラスが導入され、VBScriptなどから正規表現による検索機能が利用可能になった。

コマンドラインからファイル内テキストの正規表現検索が可能になるのは、Windows 2000(2000年)からで、リソースキットに含まれていた「qgrep」というプログラムで正規表現検索が可能になった。その後qgrepは、findstr.exeという名前で、Windows XPなどに導入され、現在に至る。

ただ、findstrは、マイクロソフト独自のコマンドで、かなり「クセ」が強い。オプション文字もMS-DOS形式で“/”を使う。正規表現も限定されたもので、grepの基本正規表現よりも機能が制限されている。たとえばカッコはグループ化の意味を持たない。

さて、現在のWindowsでgrepに相当するコマンドは、PowerShellのSelect-Stringコマンドだ。このコマンドは、指定されたファイルやパイプラインからのテキストに対して、正規表現検索が行える。機能的にはgrepに近いが、標準でPCRE(Perl互換の正規表現)に相当する、マイクロソフトの独自拡張を含む正規表現を使う。検索は、


Select-String "パターン" ファイルパス
コマンド | Select-String "パターン"

として行う。上記コマンドの最初のものは、“-Path”と“-Pattern”の2つのオプション指定が省略されている。正確には、


Select-String -Pattern "パターン" -Path ファイルパス <その他のオプション指定>

である。(表01)にSelect-Stringコマンドのオプションを示す。

  • ■表01

パラメーターとして、複数のファイル、たとえばカレントディレクトリにあるすべてのサブディレクトリ以下にある拡張子が.txtのファイル程度なら


Select-String "パターン" *\*.txt

などと指定が可能だが、複雑な指定、たとえば、サブディレクトリ全ての階層にあるテキストファイルを対象とするといった複雑な指定は、別のコマンドを併用する。たとえばGet-ChildItemコマンドなどを使ってファイルオブジェクトを列挙させ、これをパイプラインでSelect-Stringコマンドに入れる。たとえば、カレントディレクトリ以下で、ファイル名先頭がGenkoで始まるテキストファイル(拡張子が.txt)を列挙して、検索を行うには、


Get-ChildItem -Recurse -Filter Genko*.txt | select-String "パターン"

とする。このとき、対象ファイルパターンを指定する「-Filter」オプションを使うと、ファイルの列挙処理が高速になる。大量のファイルを扱う場合、同様の指定が可能な「-Include」オプションより数倍の速度差が出ることがある。“-Recurse”(再帰)オプションを使うとき、予め対象ファイルが存在する階層が分かっているなら、“-Depth 整数値”で探索範囲を限定し、処理時間を短縮させることもできる。このとき指定する整数値は、カレントディレクトリのサブディレクトリなら1を指定する。

今回のタイトルネタは、Hal ClementのNeedle(1950)。その邦題が「20億の針」(創元SF文庫)である。原題のNeedleとは、英語の「干し草の中から針を探す」(look for a needle in a haystack)という表現の「針」のことだ。「干し草の中から針を探す」とは「困難な仕事」あるいは「無駄骨を折る」という意味で使われる。そもそも、grepコマンドは、大量のテキストに対して正規表現検索を行うために作られたという。grepの登場により、複雑なテキスト検索は「困難な仕事」ではなくなった。同作は、宇宙人と人間が1つの体を共有するというアイディアを最初に使った作品と言われている。