はじめに
grepはLinuxやUnixで文字列を検索する代表的なコマンドです。
しかし、部分一致と完全一致の違いが分かりにくく、思った結果にならないことは少なくありません。
本記事では、基本から応用まで詳しく解説します
参考: GNU grep
grepで完全一致する基本構文
ファイル作成
cat << 'EOF' > input.txt
apple
banana
orange
apple pie
Apple
apple
EOF
実行コマンド
grep -x "apple" input.txt
実行結果
apple
apple
実行コマンド
grep -Fx "apple" input.txt
実行結果
apple
apple
仕組み
| 項目 | 内容 |
|---|---|
| grep | 指定した文字列を検索するコマンド |
| -x | 行全体が検索文字列と完全一致した場合のみ表示する |
| -F | 正規表現ではなく固定文字列として検索する |
| "apple" | 完全一致させたい検索文字列 |
| input.txt | 検索対象のファイル |
解説
grep -xを使用すると、行全体が検索文字列と一致した行だけを抽出できます。正規表現を無効化したい場合は-Fを組み合わせたgrep -Fxを使用すると、文字列をそのまま検索できます。
grepで完全一致する方法(-xオプション)
ファイル作成
cat << 'EOF' > input.txt
apple
orange
grape
apple pie
Apple
apple
EOF
実行コマンド
grep -x "apple" input.txt
実行結果
apple
apple
実行コマンド
grep "apple" input.txt
実行結果
apple
apple pie
apple
仕組み
| 項目 | 内容 |
|---|---|
| grep | 指定した文字列を検索するコマンド |
| -x | 行全体が検索文字列と完全一致した場合のみ表示する |
| "apple" | 検索する文字列 |
| input.txt | 検索対象のファイル |
解説
grep -xは行全体が検索文字列と一致した場合のみヒットするため、部分一致を除外できます。
完全一致で検索したい場合は、-xオプションを利用するのが最も簡単です。
grepで単語を完全一致させる方法(-wオプション)の違い
ファイル作成
cat << 'EOF' > input.txt
apple
pineapple
apple pie
Apple
apple
grape
EOF
実行コマンド
grep "apple" input.txt
実行結果
apple
pineapple
apple pie
apple
実行コマンド
grep -w "apple" input.txt
実行結果
apple
apple pie
apple
実行コマンド
grep -iw "apple" input.txt
実行結果
apple
apple pie
Apple
apple
仕組み
| コマンド | 一致方法 | pineapple | apple pie | apple |
|---|---|---|---|---|
| grep "apple" | 部分一致 | ○ | ○ | ○ |
| grep -w "apple" | 単語単位で完全一致 | × | ○ | ○ |
| grep -iw "apple" | 大文字・小文字を無視した単語単位の完全一致 | × | ○ | ○(Appleも一致) |
解説
grepは通常、指定した文字列を含む行を検索します。
-wオプションを付けると単語境界を考慮するため、pineappleのような部分一致を除外し、単語として完全一致する行だけを抽出できます。
grepで行頭・行末を指定して完全一致する方法(^と$)
ファイル作成
cat << 'EOF' > input.txt
apple
orange
grape
apple pie
pineapple
apple
EOF
実行コマンド
grep '^apple$' input.txt
実行結果
apple
apple
実行コマンド
grep -n '^apple$' input.txt
実行結果
1:apple
6:apple
実行コマンド
grep '^apple' input.txt
実行結果
apple
apple pie
apple
実行コマンド
grep 'apple$' input.txt
実行結果
apple
pineapple
apple
仕組み
| 指定方法 | 意味 | 例 | 一致する文字列 |
|---|---|---|---|
| ^ | 行頭を表す | ^apple | apple、apple pie |
| $ | 行末を表す | apple$ | apple、pineapple |
| ^...$ | 行頭から行末まで完全一致 | ^apple$ | apple のみ |
解説
^は行頭、$は行末を表す正規表現です。
両方を組み合わせた^文字列$を使うことで、行全体が指定した文字列と完全一致する行だけを抽出できます。
grepで完全一致と正規表現を使い分ける方法
ファイル作成
cat << 'EOF' > input.txt
apple
Apple
orange
apple pie
grape
apple
pineapple
EOF
実行コマンド
grep -x "apple" input.txt
実行結果
apple
apple
実行コマンド
grep "apple" input.txt
実行結果
apple
apple pie
apple
pineapple
実行コマンド
grep -w "apple" input.txt
実行結果
apple
apple pie
apple
仕組み
| 方法 | コマンド | マッチする対象 | 主な用途 |
|---|---|---|---|
| 完全一致 | grep -x "apple" input.txt | 行全体がappleの行のみ | 完全に同じ文字列を探す |
| 単語一致 | grep -w "apple" input.txt | 単語としてのappleのみ | 他の単語の一部を除外したい場合 |
| 正規表現 | grep "apple" input.txt | appleを含むすべての行 | 部分一致やパターン検索をしたい場合 |
解説
grep -xは行全体が検索文字列と一致した場合のみヒットします。
一方、通常のgrepは正規表現として扱われるため、指定した文字列を含む行すべてが検索対象になります。
grepで固定文字列による完全一致検索を高速化する方法(-F)
ファイル作成
cat << 'EOF' > input.txt
apple
banana
orange
grape
apple
pineapple
Apple
banana
EOF
実行コマンド
grep -F -x "apple" input.txt
実行結果
apple
apple
実行コマンド
grep -F -x "banana" input.txt
実行結果
banana
banana
実行コマンド
grep -F -x "Apple" input.txt
実行結果
Apple
仕組み
| 項目 | 内容 |
|---|---|
| -F | 検索文字列を正規表現ではなく固定文字列として扱うため高速に検索できる |
| -x | 行全体が検索文字列と完全一致する場合のみ一致と判定する |
| 完全一致 | apple は一致するが pineapple は一致しない |
| 高速化 | 正規表現の解析を行わないため、大量データでは通常の grep より高速になる |
解説
grep -F -x を使用すると、固定文字列による完全一致検索を高速に実行できます。
正規表現が不要な検索では、シンプルかつ効率的な方法です。
grepで複数の完全一致パターンを検索する方法
ファイル作成
cat << 'EOF' > input.txt
apple
banana
orange
grape
apple pie
banana split
orange
melon
EOF
実行コマンド
grep -x -e "apple" -e "orange" input.txt
実行結果
apple
orange
orange
仕組み
| 項目 | 内容 |
|---|---|
| grep | テキストを検索するコマンド |
| -x | 行全体がパターンと完全一致した場合のみ一致と判定する |
| -e "apple" | 検索する完全一致パターンを指定する |
| -e "orange" | 2つ目以降の検索パターンを追加する |
| input.txt | 検索対象のファイル |
解説
-eを複数指定すると、複数の検索パターンをOR条件で検索できます。
-xを組み合わせることで、部分一致ではなく行全体が一致するデータだけを抽出できます。
grepで完全一致しない行を抽出する方法(-v)
ファイル作成
cat << 'EOF' > input.txt
apple
orange
banana
apple pie
Apple
apple
EOF
実行コマンド
grep -vx "apple" input.txt
実行結果
orange
banana
apple pie
Apple
仕組み
| オプション | 説明 |
|---|---|
| grep | 条件に一致する行を検索するコマンド |
| -x | 行全体が指定した文字列と完全一致する場合のみ一致と判定する |
| -v | 一致した行ではなく、一致しない行を表示する |
| "apple" | 完全一致の判定対象となる文字列 |
| input.txt | 検索対象のファイル |
解説
-xで行全体の完全一致を判定し、-vを組み合わせることで完全一致しない行だけを抽出できます。
部分一致(apple pieなど)や大文字・小文字が異なる行(Apple)は完全一致ではないため表示されます。
grepで完全一致した件数をカウントする方法(-c)
ファイル作成
cat << 'EOF' > input.txt
apple
orange
apple
Apple
apple pie
apple
EOF
実行コマンド
grep -c -x 'apple' input.txt
実行結果
3
仕組み
| オプション | 説明 |
|---|---|
| grep | 条件に一致する行を検索するコマンド |
| -c | 一致した行数のみを表示する |
| -x | 行全体が検索文字列と完全一致する行だけを対象にする |
| 'apple' | 検索する文字列 |
| input.txt | 検索対象のファイル |
解説
grep -c -xを使用すると、指定した文字列と行全体が完全一致する行数だけを簡単にカウントできます。
Appleやapple pieのような部分一致・大文字小文字が異なる行はカウントされません。
grepで完全一致した行番号を表示する方法(-n)
ファイル作成
cat << 'EOF' > input.txt
apple
orange
banana
apple pie
apple
grape
EOF
実行コマンド
grep -nx "apple" input.txt
実行結果
1:apple
5:apple
仕組み
| オプション | 説明 |
|---|---|
| grep | テキストから条件に一致する行を検索するコマンド |
| -n | 一致した行の行番号を表示する |
| -x | 行全体が検索文字列と完全一致した場合のみ一致とする |
| "apple" | 検索する文字列 |
| input.txt | 検索対象のファイル |
解説
-xを指定すると、行全体が検索文字列と一致した場合のみ結果に表示されます。
-nと組み合わせることで、一致した行番号も同時に確認できます。
grepで複数ファイルから完全一致を検索する方法
ファイル作成
cat << 'EOF' > file1.txt
apple
orange
banana
grep
EOF
ファイル作成
cat << 'EOF' > file2.txt
grape
grep
pineapple
orange
EOF
ファイル作成
cat << 'EOF' > file3.txt
grep pattern
grep
banana
EOF
実行コマンド
grep -x "grep" file1.txt file2.txt file3.txt
実行結果
file1.txt:grep
file2.txt:grep
file3.txt:grep
仕組み
| 項目 | 内容 |
|---|---|
| grep | 指定した文字列を検索するコマンド |
| -x | 行全体が検索文字列と完全一致する場合のみ表示する |
| "grep" | 完全一致で検索する文字列 |
| file1.txt file2.txt file3.txt | 検索対象となる複数ファイル |
解説
grep -x を使用すると、行全体が検索文字列と完全一致した場合のみ結果を表示できます。
複数ファイルを指定することで、一度に完全一致する行を効率よく検索できます。
grepでディレクトリ配下を完全一致検索する方法(-r)
ファイル作成
mkdir -p logs
ファイル作成
cat << 'EOF' > logs/app.log
sample
error
warning
sample
sample.log
Sample
EOF
ファイル作成
cat << 'EOF' > logs/system.log
warning
sample
sample.log
EOF
実行コマンド
grep -r -x "sample" logs
実行結果
logs/system.log:sample
logs/app.log:sample
logs/app.log:sample
仕組み
| オプション | 説明 |
|---|---|
| grep | テキストを検索するコマンド |
| -r | ディレクトリ配下を再帰的に検索する |
| -x | 行全体が検索文字列と完全一致する場合のみ表示する |
| "sample" | 完全一致で検索する文字列 |
| logs | 検索対象のディレクトリ |
解説
grep -r -xを使用すると、ディレクトリ配下のすべてのファイルを対象に、指定した文字列と行全体が完全一致する行だけを検索できます。sample.logやSampleのような部分一致や大文字・小文字が異なる行は一致しません。
grepで完全一致検索をパイプ(|)と組み合わせる方法
ファイル作成
cat << 'EOF' > input.txt
apple
banana
orange
apple pie
apple
grape
EOF
実行コマンド
cat input.txt | grep -x "apple"
実行結果
apple
apple
実行コマンド
cat input.txt | grep -x "apple" | wc -l
実行結果
2
仕組み
| 項目 | 内容 |
|---|---|
| cat input.txt | ファイルの内容を標準出力へ出力する |
| | | 前のコマンドの標準出力を次のコマンドへ渡す(パイプ) |
| grep | 条件に一致する行を検索する |
| -x | 行全体が検索文字列と完全一致する行のみを表示する |
| "apple" | 完全一致で検索する文字列 |
| wc -l | 一致した行数を数える |
解説
grep -xを使用すると、指定した文字列と行全体が一致するものだけを抽出できます。
パイプ(|)を組み合わせることで、検索結果をさらに件数集計などのコマンドへ渡せます。
grepで完全一致検索の終了ステータスを確認する方法
ファイル作成
cat << 'EOF' > input.txt
apple
banana
orange
apple pie
Apple
EOF
実行コマンド
grep -x "apple" input.txt
実行結果
apple
実行コマンド
echo $?
実行結果
0
実行コマンド
grep -x "grape" input.txt
実行結果
no output
実行コマンド
echo $?
実行結果
1
仕組み
| 項目 | 内容 |
|---|---|
| grep -x | 行全体が検索文字列と完全一致する行だけを検索する |
| 終了ステータス 0 | 完全一致する行が1件以上見つかった |
| 終了ステータス 1 | 完全一致する行が見つからなかった |
| echo $? | 直前に実行した grep の終了ステータスを表示する |
解説
grep -xを使用すると、行全体が検索文字列と一致する場合のみヒットします。
echo $?で終了ステータスを確認すれば、シェルスクリプトでも一致・不一致を簡単に判定できます。
grepで完全一致検索ができない原因と対処法
ファイル作成
cat << 'EOF' > input.txt
apple
Apple
pineapple
apple pie
apple
grape
EOF
実行コマンド
grep -x "apple" input.txt
実行結果
apple
apple
実行コマンド
grep "apple" input.txt
実行結果
apple
pineapple
apple pie
apple
実行コマンド
grep -ix "apple" input.txt
実行結果
apple
Apple
apple
仕組み
| 原因 | 対処法 |
|---|---|
| grepはデフォルトで行内の部分一致を検索するため、pineappleやapple pieも一致する | -xを付けて行全体を対象に完全一致検索する |
| 大文字・小文字を区別するため、Appleはappleと一致しない | -iを追加してgrep -ixを使用する |
解説
grepで完全一致検索ができない原因の多くは、デフォルトが部分一致検索であることです。
-xや-ixを使うことで、意図した完全一致検索を実現できます。
grepの完全一致のポイントまとめ
grepの完全一致検索は、用途に応じてオプションや正規表現を使い分けることが重要です。
基本は-xを理解し、単語単位なら-w、柔軟な条件なら^と$や正規表現を活用すると効率的です。
基本を押さえておけば、ファイル検索やログ解析でも正確な一致検索を行えるようになります。

