grep とは、テキストファイルを指定してそのファイルの中の文字列を検索するコマンドである。 grep という名称は、ラインエディタ ed のコマンド g/re/p に由来する。 その意味は「global regular expression print(ファイル全体から/正規表現に一致する行を/表示する)」で略号になっている。
大文字・小文字の区別を無視する
行数を表示する。通常の出力はしない。
マッチの意味を逆にして、マッチしない行を抜き出して表示する。
-v オプションを同時に指定しない限り、パターンにマッチする文字列を含む行が存在するファイルの名前を列挙する
-v オプションを同時に指定しない限り、パターンにマッチする文字列を含む行が全く存在しないファイルの名前を列挙する
GPT-4o にチャットで聞いてみた例である。 ls と grep コマンドを組み合わせて使用する方法は次の通り。
# ディレクトリ1とディレクトリ2のパスを指定
dir1="/path/to/directory1"
dir2="/path/to/directory2"
# 共通のファイル名を表示
ls "$dir1" | grep -F -x -f <(ls "$dir2" )
grep は単独ではもちろん、他のコマンドとの合わせ技でさらに力を発揮する。
xargs, find コマンドと合わせて、 あるディレクトリからサブディレクトリを渡り歩いてすべての html ファイルをみつけ、 その中から特定の単語があるかを調べる、というときに使える。
$ find . -name \*html -print | xargs grep "hogehoge"
実例1では grep をパイプの後段で渡していたが、パイプの前段で使う例を挙げる。 "hogehoge"が含まれていないファイルにそれぞれに関して、wc を行う。
$ grep -L "hogehoge" *.html | xargs wc
grep の -L オプションは、 hogehoge が出てこないファイルを一覧表示する、 という意味である。
Windows では、 GNU utilities for Win32 がある。なお残念ながらNT 版 UNIX-like toolsでは、 いくつか実装されていないオプションがある (egrep における -L など)。
grep の働きをするコマンドには、ほかにも egrep や fgrep、rgrep がある。 手元の Ubuntu 20.04 の man ページには、これらはそれぞれ grep -E 、grep -F 、grep -r と同じである、 と解説されている。