この記事では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
コマンドで正規表現を使った検索をする方法
お読み頂きありがとうございました。