grep コマンド
目次
概要
grep - ファイルの中身から文字列を検索するコマンドライン
grep [OPTION]... PATTERNS [FILE]...
対象バージョン
- RHEL 10 : GNU grep 3.11
- Ubuntu 24.04 : GNU grep 3.11
説明
基本的な検索
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
: スキップします。
関連項目
Copyright (C) 2025 杜甫々
初版:2025年7月27日 最終更新:2025年7月27日
https://www.tohoho-web.com/linux/cmd/grep.html