grep コマンド

目次

概要

grep - ファイルの中身から文字列を検索する

コマンドライン

grep [OPTION]... PATTERNS [FILE]...

対象バージョン

説明

基本的な検索

grep コマンドはファイルの中から指定した文字列を検索します。

$ grep Japan fileA.txt
This is Japan.

ファイル名を表示する

複数ファイルを対象としたり、-H オプションをつけると検索結果にファイル名を表示します。

$ grep Japan *.txt
fileA.txt:This is Japan.
fileB.txt:I'm from Japan.
$ grep -H Japan fileA.txt
fileA.txt:This is Japan.

行番号を表示する

-n オプションをつけると、行番号を表示します。

$ grep -n Japan *.txt
fileA.txt:23:This is Japan.
fileB.txt:12:I'm from Japan.

ディレクトリ配下のファイルをすべて検索する

-r オプションをつけると、指定したディレクトリ配下のファイルを再帰的に検索します。-R とするとシンボリックリンク先も検索します。

$ grep -r Japan ./dirA
./dirA/fileA.txt:This is Japan.

マッチしなかった行を表示する

-v オプションをつけると、検索キーワードにマッチしなかった行を表示します。

$ grep -v Japan fileA.txt
That is America.
That is England.

正規表現を用いて検索する

通常の grep では . * ^ $ の基本正規表現(BRE)で検索できます。

$ grep '^This' file.txt

-E をつけると拡張正規表現(ERE)で検索できます。egrep コマンドにエイリアスされています。? + [ ] ( | ) { } も使用できるようになります。

$ grep -E '[0-9]+' *.txt
$ egrep '[0-9]+' *.txt

-P オプションをつけるとさらに高機能な正規表現(PCRE)で検索できます。\p{...} などを使用できます。詳細は「とほほの正規表現入門」を参照してください。

$ grep -P '\p{Hiragana}' *.txt

逆に正規表現のメタ文字を使用せず、常に文字列として検索したい場合は -F オプションをつけます。fgrep コマンドにエイリアスされています。

$ grep -F '...' *.txt
$ fgrep '...' *.txt

大文字・小文字を無視して検索する

-i オプションをつけると、大文字・小文字を無視して検索します。

$ grep -i JAPAN fileA.txt
This is Japan.

オプション

-r, --recursive
ディレクトリ配下のファイルを再帰的に検索します。
$ grep -r Keyword ./target-dir
-R, --dereference-recursive
-r と同様ですが、シンボリックリンクがあるとリンク先も検索対象とする点が異なります。

行番号表示

-n, --line-number
マッチした行の行番号を表示します。
-b, --byte-offset
行番号の代わりにマッチした行の先頭のオフセット位置(バイト単位)を表示します。

マッチしなかったファイル検索

-v, --invert-match
通常はマッチした行を表示しますが、マッチしなかった行を表示します。

検索方式

-F, --fixed-strings
PATTERNS を文字列とみなして検索します。
-G, --basic-regexp
PATTERNS を基本正規表現(BRE)とみなして検索します。. * ^ $ を使用できます。
-E, --extended-regexp
PATTERNS を拡張正規表現(ERE)とみなして検索します。? + [ ] ( | ) { } を使用できます。
-P, --perl-regexp
PATTERNS を Perl正規表現(PCRE)とみなして検索します。詳細は「とほほの正規表現入門」を参照してください。
-i, --ignore-case
パターンやデータ中の大文字・小文字を無視します。
--no-ignore-case
パターンやデータ中の大文字・小文字を無視しません。デフォルトの動作です。

検索キーワード指定

-e, --regexp=PATTERNS
PATTERNS を検索キーワードとして検索します。下記の様に検索すると This または That を含む行にマッチします。
$ grep -e This -e That file.txt
-f, --file=FILE
検索キーワード PATTERNS をファイル FILE から読み込みます。複数行記述すると、いずれかの行にマッチする行を検索します。

単語検索・行検索

-w, --word-regexp
データ中の単語と完全マッチする行のみを抽出します。
-x, --line-regexp
データ中の行と完全マッチする行のみを抽出します。

ヘルプ表示

-V, --version
バージョン情報を表示して終了します。
--help
ヘルプを表示して終了します。

ファイル名表示

デフォルトでは、複数ファイルを対象とした場合はファイル名を表示し、標準入力や単一ファイルを対象とした時はファイル名を表示しませんが、下記のオプションで制御することができます。

-H, --with-filename
単一ファイルでもファイル名を出力します。
-h, --no-filename
複数ファイルを指定した場合でもファイル名を非表示にします。
--label=LABEL
データを標準入力から受け取る場合、ファイル名の代わりとなるラベルを指定します。
$ cat file.txt | grep --label=FILE.TXT -Hn That
FILE.TXT:2:That is America.
FILE.TXT:3:That is England.

バイナリファイル検索

--binary-files=TYPE
検索対象がバイナリファイルと判断された場合の動作を指定します。TYPE には下記のいずれかを指定します。
  • binary : マッチしたら "binary file matches" とだけ表示します。
  • text : ファイルをテキストファイルと見なして通常通り検索します。
  • without-match : ファイルを検索対象から除外します。
-a, --text
--binary-files=text と同等です。
-I
--binary-files=without-match と同等です。

カラー出力

--color[=WHEN],
--colour[=WHEN]
出力のカラー化について指定します。WHEN には下記のいずれかを指定します。
  • always : 常にカラー表示します。
  • never : 常にカラー表示しません。
  • auto : 出力端末によってカラー/非カラーを自動判別します。

前後行出力

-A, --after-context=NUM
マッチした行の後の NUM 行分も表示します。
-B, --before-context=NUM
マッチした行の前の NUM 行分も表示します。
-C, --context=NUM
マッチした行の前後の NUM 行分も表示します。
-NUM
--context=NUM と同等です。
--group-separator=SEP
-A, -B, -C オプションでは各出力グループの間にセパレータ -- を表示しますが、このデリミタを SEP に変更します。
--no-group-separator
-A, -B, -C オプションのセパレータ -- を表示しません。

ファイル名のみ出力

-l, --files-with-matches
マッチしたファイルのファイル名のみを表示します。
$ grep -rl Keyword ./target-dir
./target-dir/fileA.txt
./target-dir/fileB.txt
-L, --files-without-match
マッチしなかったファイルのファイル名のみを表示します。
$ grep -rL Keyword ./target-dir
./target-dir/fileC.txt
./target-dir/fileD.txt
-c, --count
各ファイルについて、マッチした行の行数を表示します。
$ grep -rc Keyword ./target-dir
./target-dir/fileA.txt:3
./target-dir/fileB.txt:2
./target-dir/fileC.txt:0
./target-dir/fileD.txt:0

出力無し

-q, --quiet, --silent
検索結果を出力しません。検索結果の表示は不要で、見つかったか、見つからなかったかをコマンドの終了ステータスで判断する場合などに有用です。終了ステータスは、見つかった場合は正常(0)、見つからなかった場合は異常(0以外)を返します。
if grep -q Keyword file.txt; then
    echo "Found!"
else
    echo "Not found!"
fi

検索対象除外

--include=GLOB
GLOB にマッチするファイルのみを検索対象とし、その他のファイルは検索対象から除外します。下記の例では *.conf にマッチするファイルのみを検索対象とします。
$ grep -r --include="*.conf" Keyword ./target-dir
--exclude=GLOB
GLOB にマッチするファイルを検索対象から除外します。下記の例では *.bak にマッチするファイルを検索対象から除外します。
$ grep -r --exclude="*.bak" Keyword ./target-dir
--exclude-from=FILE
FILE に記述された各行にマッチするファイルを検索対象から除外します。下記の例では *.bak*.old にマッチするファイルを検索対象から除外します。
$ cat > exclude.txt <<EOF
> *.bak
> *.old
> EOF
$ grep -r --exclude-from=exclude.txt Keyword ./target-dir
--exclude-dir=GLOB
GLOB にマッチするファイルを検索対象から除外します。下記の例では old という名前のディレクトリを検索対象から除外します。
$ grep -r --exclude-dir="old" Keyword ./target-dir

ヌル文字セパレータ

通常は改行文字をセパレータとしますが、find-print0 オプションと組み合わせるなど、ヌル文字をセパレータとすることにより、たとえ改行文字を含んだファイルが存在してもうまく処理できる堅牢な処理を行うことができます。

-z, --null-data
改行コード(LF)ではなくヌル文字(NUL)で行を分割します。
-Z, --null
ファイル名の後にヌル文字(NUL)を出力します。

その他

-o, --only-matching
行全体ではなく、マッチした部分のみを出力します。
$ grep -o That file.txt
That
That
-T, --initial-tab
ファイル名とマッチした行の間にタブ文字を出力します。ファイル名の長さが多少異なっていても検索結果の表示の先頭位置がある程度そろいます。
$ grep Japan file*.txt
fileA.txt:This is Japan.
fileBC.txt:This is Japan.
$ grep -T Japan file*.txt
fileA.txt:      This is Japan.
fileBC.txt:     This is Japan.
-m, --max-count=NUM
NUM 行まで検索したらそのファイルに対する検索を終了します。
-s, --no-messages
Permission denied などのエラーメッセージを表示しません。
--line-buffered
出力バッファを1行毎にフラッシュします。ファイルにリダイレクトしたり、他コマンドにパイプ(|) で渡す際、バッファリングしなくなります。
-U, --binary
行末の復帰コード(CR)を無視しません。MS-DOS や Windows 用のオプションです。
-d, --directories=ACTION
検索対象がディレクトリの場合の動作を指定します。ACTION には下記のいずれかを指定します。
  • read : ディレクトリを無理矢理通常ファイルとして読み込もうとします。
  • recurse : -r-R オプションと同様、再帰的に検索します。
  • skip : スキップします。
-D, --devices=ACTION
検索対象がデバイスファイル、FIFOファイル、ソケットファイルの場合の動作を指定します。ACTION には下記のいずれかを指定します。
  • read : ディレクトリを無理矢理通常ファイルとして読み込もうとします。
  • skip : スキップします。