プロぽこ

パターンで覚えるgrep高速検索術【特定の文字列を検索したい時に使うコマンド】

grepは特定の文字列を検索したい時に最も使われるコマンドです。

特にインフラエンジニアやサーバーサイドエンジニアであれば、ログを検索する時に重宝するコマンドです。基本的な使い方を覚えるだけでもとても生産性が上がりますが、オプションを覚えるとさらに検索が捗るのでぜひ覚えましょう。

この記事では基本的な使い方と利用パターンごとにgrepコマンドの各種オプションを紹介していきます。あなたのやりたい事もきっと見つかるでしょう。

grepの基本的な使い方

一般的にgrepが使われる場面としては前述したログの検索や特定ディレクトリ以下のソースコードを調べるといった場面です。

ログファイルの検索は基本的に1ファイルからの検索になると思います。1ファイルから特定の文字列を検索する場合「less」や「tail」などの他のコマンドと組み合わせて使うのが普通です。

もちろんgrepコマンド単体での検索も可能です。下記の内容のファイル「file.txt」を用意して検索します。

aaa,12345,ttt,11111
bbb,15678,tuu,22233
ccc,76543,aaa,55555
ddd,11334,bbb,66999
eee,15599,qqq,12222

「aaa」という文字列を検索するには下記のようにします。

less file.txt | grep aaa
// 結果
aaa,12345,ttt,11111
ccc,76543,aaa,55555

aaa という文字列が含む行のみが抽出されました。


また、grepコマンドだけで検索する場合、下記のようにします。

grep "aaa" file.txt
// 結果
aaa,12345,ttt,11111
ccc,76543,aaa,55555

先ほどと同様にaaa という文字列が含む行のみが抽出されました。

様々なgrepコマンドの使い方

ディレクトリ以下からの検索

特定ディレクトリ以下のファイル群からまとめて文字列を検索する場合は下記のようにします。

grep [検索文字列] [検索ディレクトリ] -r

先ほどのファイルをコピーして「file2.txt」を作成し、カレントディレクトリから検索します。

grep "aaa" ./ -r
// 結果
.//file.txt:aaa,12345,ttt,11111
.//file.txt:ccc,76543,aaa,55555
.//file2.txt:aaa,12345,ttt,11111
.//file2.txt:ccc,76543,aaa,55555

ファイル名とともに該当する文字列がある行が表示されます。

検索にマッチした文字列のファイルないので行番号を表示する

検索結果のファイル内での行数を表示することができます。

grep [検索文字列] [検索ファイル] -n

行頭に行番号が表示されます。

grep "aaa" file.txt -n
// 結果
1:aaa,12345,ttt,11111
3:ccc,76543,aaa,55555

検索にマッチした行数のみを表示する

「c」オプションを付けることで検索し、マッチした行数を表示することができます。

grep [検索文字列] [検索ファイル名] -c

ディレクトリの以下をファイル検索の場合にも「c」オプションが有効です。

grep "aaa" ./ -rc
// 結果
.//file.txt:2
.//file2.txt:2

検索にマッチしない行のみを表示する

「v」オプションを使う事で、検索しマッチした行を表示するのではなく、逆にマッチしなかった行のみを表示する事ができます。

かなり利用頻度の高いオプションとなると思います。

grep [検索文字列] [検索ファイル] -n

下記のように使用する事で、マッチしない行のみが表示されます。

grep "aaa" file.txt -v
// 結果
bbb,15678,tuu,22233
ddd,11334,bbb,66999
eee,15599,qqq,12222

検索にマッチした内容を含むファイル名のみを表示する

grepは検索にマッチしたファイルのファイル名のみを表示する事も可能です。

grep [検索文字列] [検索ファイル名] -l

検索ファイル名としてはワイルドカード「*」を利用する事ができます。下記のようにする事でカレントディレクトリすべてのファイルを対象とする事ができます。

grep "aaa" * -l
// 結果
file.txt
file2.txt

拡張子「txt」のみの検索とかもできます。

grep "aaa" *.txt -l
// 結果
file.txt
file2.txt

「l」を大文字の「L」に変える事で検索条件にマッチしなかったファイル名を表示する事ができます。

grep "ppap" * -L
// 結果
file.txt
file2.tx

grep "aaa" * -L
// 結果
(なし)

検索文字列が1行に完全一致する行を表示する

通常のgrep は検索文字がその行に一部分でも含まれていた場合マッチしたと認識しますが「x」オプションを指定すると完全一致した場合にのみマッチしたと認識されるようになります。下記のパターンではマッチしなくなります。

grep "aaa" file.txt -x
// 結果
(なし)

1行完全一致パターンだと結果が表示されます。

grep "bbb,15678,tuu,22233" file.txt -x
// 結果
bbb,15678,tuu,22233

まとめ

grep を使う事であらゆる検索を高速にする事ができます。最終的には「grep オプション」でググる事なく利用できるようになるのが理想です。

使い方を覚えていればその時間すら短縮できます。grepのオプションはまだまだありますが、この記事で紹介したようなパターンごとに覚えておけば大抵は対応できるはずですので、ぜひ覚えておきましょう。

おまけ1

grep より高パフォーマンスの「ack」「ag」コマンド。

grep より高パフォーマンスであるということで近年注目を集めているコマンドが「ack」「ag」です。オプションは基本的にgrepと同じものが使えるので興味がある方はこれらのコマンドを使ってみるのも良いでしょう。

mac等にもデフォルトで入っていないと思いますので使う場合はhomebrew等でインストールしましょう。

おまけ2

Gitのリポジトリ配下限定でgrep をかける「git grep」というものがあります。そのリポジトリ配下限定ですが、
とても高速な検索を行う事ができます。こちらも基本的にgrep同等のオプションを利用する事ができます。