【Linux】grepコマンドの使い方やオプションを詳しく解説!

この記事ではLinuxの『grepコマンド』について、

  • Linuxのgrepコマンドとは
  • grepコマンドの使い方
  • grepコマンドのオプション
  • grepコマンドを他のコマンドと組み合わせる方法
  • grepコマンドで正規表現を使った検索をする方法

などを分かりやすく説明するように心掛けています。ご参考になれば幸いです。

Linuxのgrepコマンドとは

Linuxのgrepコマンドは、ファイルの中の文字列に対して、特定のパターンが含まれている行を表示するコマンドです。

以下にLinuxのgrepコマンドの構文を示します。

Linuxのgrepコマンドの構文

grep [オプション] パターン ファイル名
grep [オプション] パターン ディレクトリ名

grepコマンドは多くのオプションと組み合わせて使用することができます(後ほど、grepコマンドのオプションとその使い方について詳しく説明します)。

補足

grepコマンドの「grep」は「global regular expression print」の略です。

grepコマンドの使い方

ファイルから特定のパターンが含まれている行を表示する

例えば、以下の内容を持つexample.txtファイルがあるとします。

$ cat example.txt
apple
banana
cherry
peach
raspberry

example.txtファイルから"a"を含む文字列を検索する場合、以下のコマンドを実行します。

grep a example.txt

実行結果

$ grep a example.txt
apple
banana
peach
raspberry

検索文字列"a"はexample.txtファイルのapple, banana, peach, raspberryに含まれているので、上記の実行結果になります。

ディレクトリから特定のパターンが含まれている行を表示する

ファイル名の代わりにディレクトリ名を指定することで、指定ディレクトリのすべてのファイルから検索を行うことができます。以下の内容を持つexample2.txtファイルを追加したとします。

$ cat example2.txt
avocado
corn
onion
tomato

カレントディレクトリ内のすべてのファイルから"a"を含む文字列を検索する場合、以下のコマンドを実行します。

grep a ./*

実行結果

$ grep a ./*
./example.txt:apple
./example.txt:banana
./example.txt:peach
./example.txt:raspberry
./example2.txt:avocado
./example2.txt:tomato

ディレクトリを検索した場合、実行結果にはファイル名も含まれます。

パイプ(|)を用いてand検索する

複数の条件を同時に満たす文字列を検索する場合、パイプ(|)を使って条件を組み合わせることができます。

grep パターン1 ファイル名 | grep パターン2
grep パターン1 ディレクトリ名 | grep パターン2

パイプ(|)を用いると、ファイルまたはディレクトリからパターン1とパターン2の両方が含まれる行を検索することができます。例えば、 example.txtファイル内で"a"と"e"の両方を含む文字列を検索する場合、以下のコマンドを実行します。

grep a example.txt | grep e

実行結果

$ grep a example.txt | grep e
apple
peach
raspberry

grepコマンドのオプション

以下にgrepコマンドの主なオプションを示します。

短い
オプション
長い
オプション
説明
--help使用可能なオプションの一覧を表示する
-e--regexp=OR条件での検索をする
-i--ignore-case大文字小文字を区別せずに検索する
-v--invert-match指定したパターンに一致しない行を表示する
-o--only-matching指定したパターンに一致した部分のみを表示する
-C--context指定したパターンに一致した行の前後の行数を指定して表示する
-A--after-context=指定したパターンに一致した行の後の行数を指定して表示する
-B--before-context=指定したパターンに一致した行の前の行数を指定して表示する
-n--line-number指定したパターンに一致した行の行番号も表示する
-c--count指定したパターンに一致した行の総数を表示する
-l--files-with-matches指定したパターンに一致した行を含むファイル名のみを表示する
-L--files-without-match指定したパターンに一致した行を含まないファイル名のみを表示する
-h--no-filename指定したパターンに一致した行をファイル名を除いて表示する
-r--recursive指定したディレクトリ内のすべてのファイルを再帰的に検索する
-E--extended-regexp拡張正規表現で検索する

これからgrepコマンドの各オプションについて順番に説明します。

grep --help

grepコマンドに--helpオプションをつけることで、使用可能なオプションの一覧を確認することができます。実行結果を以下に示します。

$ grep --help
Usage: grep [OPTION]... PATTERN [FILE]...
Search for PATTERN in each FILE or standard input.
PATTERN is, by default, a basic regular expression (BRE).
Example: grep -i 'hello world' menu.h main.c

Regexp selection and interpretation:
  -E, --extended-regexp     PATTERN is an extended regular expression (ERE)
  -F, --fixed-strings       PATTERN is a set of newline-separated strings
  -G, --basic-regexp        PATTERN is a basic regular expression (BRE)
  -P, --perl-regexp         PATTERN is a Perl regular expression
  -e, --regexp=PATTERN      use PATTERN for matching
  -f, --file=FILE           obtain PATTERN from FILE
...(省略)

--helpオプションは、grepコマンドの全オプションの一覧を表示します。これにより、どのようなオプションが利用可能かを確認できます。

grep -e

grepコマンドに-eオプション(または--regexp=オプション)をつけると、OR条件での検索をします。

基本構文

# -eオプションを使用
grep -e パターン1 -e パターン2 ファイル名(またはディレクトリ名)
# --regexp=オプションを使用
grep --regexp=パターン1 --regexp=パターン2 ファイル名(またはディレクトリ名)

例えば、example.txtファイル内で"apple"と"cherry"の両方を含む文字列を検索する場合、以下のコマンドを実行します。

# -eオプションを使用
grep -e apple -e cherry example.txt
# --regexp=オプションを使用
grep --regexp=apple --regexp=cherry example.txt

実行結果

$ grep -e apple -e cherry example.txt
apple
cherry

grep -i

grepコマンドに-iオプション(または--ignore-caseオプション)をつけると、大文字小文字を区別せずに検索します。

例えば、example.txtファイル内で"APPLE"の文字列(大文字小文字を問わない)を検索する場合、以下のコマンドを実行します。

# -iオプションを使用
grep -i APPLE example.txt
# --ignore-caseオプションを使用
grep --ignore-case APPLE example.txt

実行結果

$ grep -i APPLE example.txt
apple

grep -v

grepコマンドに-vオプション(または--invert-matchオプション)をつけると、指定したパターンに一致しない行を表示します。

例えば、example.txtファイル内で"apple"の文字列が含まれていない行を検索する場合、以下のコマンドを実行します。

# -vオプションを使用
grep -v apple example.txt
# --invert-matchオプションを使用
grep --invert-match apple example.txt

実行結果

$ grep -v apple example.txt
banana
cherry
peach
raspberry

grep -o

grepコマンドに-oオプション(または--only-matchingオプション)をつけると、指定したパターンに一致した部分のみを表示します。

例えば、example.txtファイル内で"a"を含むすべての部分を表示する場合、以下のコマンドを実行します。

# -oオプションを使用
grep -o a example.txt
# --only-matchingオプションを使用
grep --only-matching a example.txt

実行結果

$ grep -o a example.txt
a
a
a
a
a
a

grep -C

grepコマンドに-Cオプション(または--contextオプション)をつけると、指定したパターンに一致した行の前後の行数を指定して表示します。

基本構文

# -Cオプションを使用
grep -C 行数 パターン ファイル名(またはディレクトリ名)
# --contextオプションを使用
grep --context 行数 パターン ファイル名(またはディレクトリ名)

例えば、example.txtファイル内で"cherry"を含む行と、その前後1行を表示する場合、以下のコマンドを実行します。

# -Cオプションを使用
grep -C 1 cherry example.txt
# --contextオプションを使用
grep --context 1 cherry example.txt

実行結果

$ grep -C 1 cherry example.txt
banana
cherry
peach

grep -A

grepコマンドに-Aオプション(または--after-context=オプション)をつけると、指定したパターンに一致した行の後の行数を指定して表示します。

基本構文

# -Aオプションを使用
grep -A 行数 パターン ファイル名(またはディレクトリ名)
# --after-context=オプションを使用
grep --after-context=行数 パターン ファイル名(またはディレクトリ名)

例えば、example.txtファイル内で"cherry"を含む行と、その後の1行を表示する場合、以下のコマンドを実行します。

# -Aオプションを使用
grep -A 1 cherry example.txt
# --after-context=オプションを使用
grep --after-context=1 cherry example.txt

実行結果

$ grep -A 1 cherry example.txt
cherry
peach

grep -B

grepコマンドに-Bオプション(または--before-context=オプション)をつけると、指定したパターンに一致した行の前の行数を指定して表示します。

基本構文

# -Bオプションを使用
grep -B 行数 パターン ファイル名(またはディレクトリ名)
# --before-context=オプションを使用
grep --before-context=行数 パターン ファイル名(またはディレクトリ名)

例えば、example.txtファイル内で"cherry"を含む行と、その前の1行を表示する場合、以下のコマンドを実行します。

# -Bオプションを使用
grep -B 1 cherry example.txt
# --before-context=オプションを使用
grep --before-context=1 cherry example.txt

実行結果

$ grep -B 1 cherry example.txt
banana
cherry

grep -n

grepコマンドに-nオプション(または--line-numberオプション)をつけると、指定したパターンに一致した行の行番号も表示します。

例えば、example.txtファイル内で"e"を含む行と、その行番号を表示する場合、以下のコマンドを実行します。

# -nオプションを使用
grep -n e example.txt
# --line-numberオプションを使用
grep --line-number e example.txt

実行結果

$ grep -n e example.txt
1:apple
3:cherry
4:peach
5:raspberry

grep -c

grepコマンドに-cオプション(または--countオプション)をつけると、指定したパターンに一致した行の総数を表示します。

例えば、example.txtファイル内で"e"を含む行の総数を表示する場合、以下のコマンドを実行します。

# -cオプションを使用
grep -c e example.txt
# --countオプションを使用
grep --count e example.txt

実行結果

$ grep -c e example.txt
4

grep -l

grepコマンドに-lオプション(または--files-with-matchesオプション)をつけると、指定したパターンに一致した行を含むファイル名のみを表示します。

例えば、カレントディレクトリ内のファイルのうち、"a"を含む行を含むファイル名を表示する場合、以下のコマンドを実行します。

# -lオプションを使用
grep -l a ./*
# --files-with-matchesオプションを使用
grep --files-with-matches a ./*

実行結果

$ grep -l a ./*
./example.txt
./example2.txt

【参考】-lオプションをつけなかった場合の実行結果

$ grep a ./*
./example.txt:apple
./example.txt:banana
./example.txt:peach
./example.txt:raspberry
./example2.txt:avocado
./example2.txt:tomato

grep -L

grepコマンドに-Lオプション(または--files-without-matchオプション)をつけると、指定したパターンに一致した行を含まないファイル名のみを表示します。

例えば、カレントディレクトリ内のファイルのうち、"y"を含む行を含まないファイル名を表示する場合、以下のコマンドを実行します。

# -Lオプションを使用
grep -L y ./*
# --files-without-matchオプションを使用
grep --files-without-match y ./*

実行結果

$ grep -L y ./*
./example2.txt

【参考】-Lオプションをつけなかった場合の実行結果

$ grep y ./*
./example.txt:cherry
./example.txt:raspberry

grep -h

grepコマンドに-hオプション(または--no-filenameオプション)をつけると、指定したパターンに一致した行をファイル名を除いて表示します。

例えば、カレントディレクトリ内のすべてのファイルから"a"を含む列をファイル名を除いて表示する場合、以下のコマンドを実行します。

# -hオプションを使用
grep -h a ./*
# --no-filenameオプションを使用
grep --no-filename a ./*

実行結果

$ grep -h a ./*
apple
banana
peach
raspberry
avocado
tomato

【参考】-hオプションをつけなかった場合の実行結果

$ grep a ./*
./example.txt:apple
./example.txt:banana
./example.txt:peach
./example.txt:raspberry
./example2.txt:avocado
./example2.txt:tomato

grep -r

grepコマンドに-rオプション(または--recursiveオプション)をつけると、指定したディレクトリ内のすべてのファイルを再帰的に検索します。

例えば、以下のようなディレクトリ構成だと仮定します。

カレントディレクトリ
├─example.txt
├─example2.txt
└─test
  └─example3.txt

example3.txtファイルは以下の内容であるとします。

$ cat test/example3.txt
coffee
tea
water

カレントディレクトリおよびそのサブディレクトリ(今回の場合はtestディレクトリ)内のすべてのファイルから"e"を含む行を表示する場合、以下のコマンドを実行します。

# -rオプションを使用
grep -r e ./*
# --recursiveオプションを使用
grep --recursive e ./*

実行結果

$ grep -r e ./*
./example.txt:apple
./example.txt:cherry
./example.txt:peach
./example.txt:raspberry
./test/example3.txt:coffee
./test/example3.txt:tea
./test/example3.txt:water

【参考】-rオプションをつけなかった場合の実行結果

$ grep e ./*
./example.txt:apple
./example.txt:cherry
./example.txt:peach
./example.txt:raspberry
grep: ./test: Is a directory

-rオプションをつけない場合、カレントディレクトリ直下のファイルしか検索されません(example3.txtファイルは検索されません)。

grep -E

grepコマンドに-Eオプション(または--extended-regexpオプション)をつけると、拡張正規表現で検索を行えます。|などの記号をエスケープなしで使用できるようになります。

例えば、カレントディレクトリ内のすべてのファイルから"a"または"e"を含む行を表示する場合、以下のコマンドを実行します。

# -Eオプションを使用
grep -E 'a|e' example.txt
# --extended-regexpオプションを使用
grep -extended-regexp 'a|e' example.txt

実行結果

$ grep -E 'a|e' example.txt
apple
banana
cherry
peach
raspberry

【参考】-Eオプションをつけなかった場合の実行結果

$ grep 'a\|e' example.txt
apple
banana
cherry
peach
raspberry

-Eオプションを使用しない場合、上記に示すように|などの記号をエスケープする必要があります。

grepコマンドを他のコマンドと組み合わせる

grepコマンドを他のコマンドと組み合わせることで、より高度な検索が可能になります。

基本構文

他のコマンド | grep パターン

例えば、lsコマンドの出力(カレントディレクトリのファイルとディレクトリがアルファベット順に表示される)から"example"を含む行(ファイル名)を検索する場合、以下のコマンドを実行します。

ls | grep example

実行結果

$ ls | grep example
example.txt
example2.txt

この結果は、lsコマンドの出力から"example"を含む行(ファイル名)を表示します。

正規表現を使った検索

正規表現を使うことで、より柔軟で高度な検索が可能になります。以下に基本構文を示しています。

基本構文

grep 正規表現 ファイル名(またはディレクトリ名)

例として、以下のような検索が可能です。

行の先頭に一致する検索

行の先頭に一致する検索をする場合には以下のように記述します。

基本構文

grep ^パターン ファイル名

例えば、example.txtファイル内で"a"で始まる行を表示する場合、以下のコマンドを実行します。

grep ^a example.txt

実行結果

$ grep ^a example.txt
apple

行の末尾に一致する検索

行の末尾に一致する検索をする場合には以下のように記述します。

基本構文

grep パターン$ ファイル名

例えば、example.txtファイル内で"y"で終わる行を表示する場合、以下のコマンドを実行します。

grep y$ example.txt

実行結果

$ grep y$ example.txt
cherry
raspberry

特定の範囲に一致する検索

特定の範囲に一致する検索をする場合には以下のように記述します。

基本構文

grep [a-z] ファイル名

例えば、example.txtファイル内で"a"から"c"のいずれかの文字を含む行を表示する場合、以下のコマンドを実行します。

grep [a-c] example.txt

実行結果

$ grep [a-c] example.txt
apple
banana
cherry
peach
raspberry

また、example.txtファイル内で"a"から"c"のいずれかの文字で始まる行を表示する場合、以下のコマンドを実行します。

grep ^[a-c] example.txt

実行結果

$ grep ^[a-c] example.txt
apple
banana
cherry

本記事のまとめ

この記事ではLinuxの『grepコマンド』について、以下の内容を説明しました。

  • Linuxのgrepコマンドとは
  • grepコマンドの使い方
  • grepコマンドのオプション
  • grepコマンドを他のコマンドと組み合わせる方法
  • grepコマンドで正規表現を使った検索をする方法

お読み頂きありがとうございました。