grepを使った便利なコマンド一覧



業務で楽するためのUNIXテクニック集「検索」編

この記事は2008年~2009年頃に翔泳社で連載していた「業務で楽するためのUNIXテクニック集」の原本です。

はじめに

 この連載では、UNIX系OSをコマンドライン上から効率よく利用するために知っておくべきテクニックや、便利な小技を紹介していきます。

 今回は「ファイル・ファイル内容の検索」に関するテクニックを紹介します。

スポンサードリンク

関連記事

テキストファイルを検索する(grepコマンド)

 grepは、ファイル内から指定した文字列に一致する内容を含む行を検索するコマンドです。文字列には正規表現を指定することも可能です。

$ grep[オプション][検索文字列][ファイル名]

 デフォルトでは指定した文字列と一致する部分が見つかった行を表示します。代表的なオプションには、次のようなものがあります。

grepコマンドの代表的なオプション

-オプション機能
-i 大文字と小文字を区別しない
-l パターンに一致した行を含むファイル名だけを出力する
-n パターンに一致した行のファイル内での行番号を表示する
-v パターンに一致しない行を表示する
※ grep 2.5以降の場合、次のオプションも利用可能です。

-オプション 機能
--color 一致文字列に色を付ける事ができる
-o (--only-matching) 一致した文字列だけを出力する
-r 特定ディレクトリ以下を再帰的に検索する

 grepコマンドを利用した例を2つ紹介します。

複数の検索文字を指定して検索(OR検索)する

 文字列「aomori」を含む行と文字列「yamanashi」を含む行を、「fruits.txt」ファイルから抜き出します。

$ cat fruits.txt
1001,unshu-mikan,wakayama
1002,apple,aomori
1003,japanese pear,chiba
1004,grape,yamanashi
1005,peach,yamanashi

$ grep -e "aomori" -e "yamanashi" fruits.txt
1002,apple,aomori
1004,grape,yamanashi
1005,peach,yamanashi

 次のような指定をすることも可能です。

$ grep "aomori\|yamanashi" fruits.txt

 「|(パイプ)」の前に「\(バックスラッシュ)」を入れないとOR検索にならないので注意してください。

複数の検索文字を指定して検索する(AND検索)

 grepコマンドで、AND条件を指定する場合は、シェルスクリプトのパイプ機能を使って、2つのgrepコマンドを結びつけます。

$ grep "yamanashi" fruits.txt | grep "peach"
1005,peach,yamanashi

 上記の例を実行すると、ファイル内の文字列「yamanashi」と文字列「peach」が両方含まれる行を取得できます。

grepするときに「.svn」「.git」ディレクトリを除外する

 特定の文字列を検索した際に不要なディレクトリを検索対象から外す方法です。

grep -rn 'hoge' ./ --exclude-dir=.git

ソースの中から文字列を検索する

 複数あるファイルの中からソースコード(.c)だけを検索して、それらのファイルから文字列「hoge」を検索する方法です。

find . -name \*.c -exec grep hoge {} \;

上記の手法は、「*.c」のファイルの数だけ grep コマンドが実行されるため、時間がかかります。

その場合は、次のコマンドを利用してください。

find . -name \*.c -print | xargs grep hoge

もしくは、次のコマンドでも可能です。

find . -name \*.c -print0 | xargs -0 grep hoge /dev/null
find . -type f -exec grep -il confirm {} \;

なお、 ag (The Silver Searcher) を使うとより高速にこの要求を満たせます。

スポンサードリンク