文字列の検索をおこなう古くから存在するツールとして、grepが挙げられます。膨大なHTML、JavaScript、CSSファイルからある文字列が含まれる箇所を目で確認するのは至難の業です。GUIのツールに検索機能が付随するものもありますが、今回は古くから存在するコマンドを用いて、特定のディレクトリ内から全文検索を簡単におこなう方法をご紹介します。
grepとは
grepとは、UNIX系のOSに付属するコマンドのひとつです。テキストファイルから、検索条件(パターン)に一致する行を検索して表示します。さまざまなオプションが用意されており、用途に応じて柔軟な条件で文字列を検索できます。
正規表現を用いることで、さまざまなファイルから複雑な検索条件に一致する箇所を簡単に発見することができます。今日では、GUIのエディタや統合開発環境にgrepと同等の機能が搭載されていることも少なくありません。
今回は、このgrepコマンドを使った文字列の検索方法についてご紹介します。
Windows向けgrep(GnuWin grep)のインストール
WindowsでgrepライクなツールはGUI・CUI含めて数多くリリースされていますが、ここではGnuWinプロジェクトのgrepをご紹介したいと思います。GnuWinプロジェクトでは、GNU General Public Licenseなどの各種オープンソースソフトウェアライセンスで提供されているツールをWindowsに移植しているプロジェクトです。執筆時点で、174のツールが成果物として公開されています。
GnuWinのgrepページにアクセスし、Complete package, except sourcesからインストーラ(Md5sum: 77a21eb688da4cd7746ce7e92af8f4da)をダウンロードし、インストールをおこないます。
インストール先ディレクトリのカスタマイズをおこなわず、インストールをおこないます。grepをインストール後、環境変数PATHの設定をおこないます。システムのプロパティより、環境変数設定ダイアログでユーザ環境変数に次の値を追加します。
変数名 | PATH |
---|---|
変数値 | C:\Program Files\GnuWin32\bin |
環境変数PATHを設定後、コマンドプロンプト上でgrepコマンドを実行してみましょう。
Mac OS Xでgrepを使用する
Mac OS Xでは、最初からgrepがインストールされています。ターミナルを起動し、grepコマンドを実行します。
grepの使い方
grepの書式は、次のようになっています。
grep オプション 検索文字列(パターン) 検索対象のファイル
まずはオプションを指定せず、grepで検索をおこなってみましょう。次のコマンドは、カレントディレクトリのindex.htmlファイル内から「
grep "<meta" index.html
ファイルにアスタリスク(*)を指定すると、カレントディレクトリの全ファイルに対して検索をおこないます。次のコマンドは、カレントディレクトリ内のファイル内で「find」が含まれるファイル名と該当行を表示します。
grep "find" *
grepのオプションは、ハイフン(-)に続けて指定をおこないます。ハイフンの後に数字を指定すると、grepは検索文字列(パターン)に該当した行の前後指定行を表示します。次のコマンドは、カレントディレクトリ内のファイルで「find」が含まれるファイル名と、該当した行の前後2行を表示します。
grep -2 "find" *
オプションにnを指定すると、該当した行の行番号を表示します。次のコマンドは、カレントディレクトリ内のファイル内で「find」が含まれるファイル名と該当行を行番号付きで表示します。
grep -n "find" *
オプションにcを指定すると、該当した行の行数をカウントします。次のコマンドは、カレントディレクトリ内のファイル内で「find」が含まれるファイル名と行数を表示します。
grep -c "find" *
オプションにrを指定すると、サブディレクトリを再帰的に検索します。次のコマンドは、カレントディレクトリ内のサブディレクトリを含めた全ファイルから「utilNav」が含まれるファイル名と該当行を表示します。
grep -r "utilNav" *
オプションにiを指定すると、パターンに入力された文字列を大文字小文字を区別せずに検索します。次のコマンドは、カレントディレクトリ内のファイルで、大文字小文字を区別せずに「utilnav」が含まれるファイル名と該当行を表示します。
grep -i "utilnav" *
複数のオプションを組み合わせて使用することもできます。次のコマンドは、カレントディレクトリ内のサブディレクトリを含めた全ファイルから、大文字小文字を区別せずに「utilnav」が含まれるファイル名と該当行を行番号付きで表示します。
grep -inr "utilnav" *
次のコマンドは、カレントディレクトリ内のファイルで「find」が含まれるファイル名と該当行、その前後2行を行番号付きで表示します。
grep -2n "find" *
複数の検索条件を入力したい場合は、コマンドをパイプ(|)でつなげます。次のコマンドは、カレントディレクトリ内のサブディレクトリを含めた全ファイルから「find」および「slide」が含まれるファイル名と該当行を行番号付きで表示します。
grep -nr "find" * | grep "slide"
オプションにvを指定すると、パターンに指定した文字列を含まない行を表示します。次のコマンドは、カレントディレクトリ内のサブディレクトリを含めた全ファイルから「find」が含まれる行の中で、「slide」が含まれないファイル名と該当行を行番号付きで表示します。
grep -nr "find" * | grep -v "slide"
grepコマンドで利用できるオプションをおさらいしてみましょう。
オプション | 動作 |
---|---|
-(数字) | パターンに該当する行と、その前後行を表示 |
-c | パターンに該当する行の行数をカウントして表示 |
-A(数字) | パターンに該当する行と、その後の行を表示 |
-B(数字) | パターンに該当する行と、その前の行を表示 |
-E | パターンを正規表現として検索 |
-i | パターンに指定した文字列について、大文字小文字を区別せずに検索 |
-n | 表示時に行番号を追加する |
-r | 再帰的に検索 |
-v | パターンに一致した行を除外して表示 |
なお、grepのバージョンによっては一部使用できないオプション等もあります。利用しているgrepのバージョンに該当するマニュアルをご参照ください。
単純な作業を効率化・省力化することで、本来時間をかけるべき作業に注力することが可能になります。CUIの各種コマンドは慣れるまでが大変ですが、一度習得してしまうと動作の機敏さ、柔軟さ、使いやすさから手放せない道具になるでしょう。ターミナルやコマンドプロンプトにあまり触ったことがない方は、ぜひCUIの開発ツールを体験してみましょう。
富田宏昭 Hiroaki Tomida
「株式会社キクミミ」でFileMakerやオープンソース言語などを用いた、Webアプリ開発 企業の業務改善のためのシステム開発や環境構築を行っている。主な著書に「HTML5/JavaScriptとPhoneGapで作るiPhoneアプリ開発入門」(マイナビ)など。