grep - 文字列検索やパターンマッチしたファイル検索をする

grep

grepコマンドは、文字列検索や特定の文字列を持つファイルの検索を行うことができます。
例えば、ファイルの中にあるパターンにマッチした行を検索や逆にパターンにマッチしなかった行を表示することが可能です。

目次

grepとは

文字列検索やパターンにマッチしたファイルの検索を行うことができるコマンドです。
ファイルの文字列検索はマッチした行だけではなく、マッチしなかった行の表示も行うことができます。
パターンにマッチしたファイル名や行番号も表示することができます。
また、パターンにマッチした行の前後の行やパターンにマッチした行の行数の表示も行うことができます。

grepコマンドの構文

grepコマンドの構文

オプション:0個以上のオプションをつけることができます。

パターン:'-e パターン' または '-f ファイル名'でパターンを指定する場合、必要ありません。

入力ファイル:0個以上の入力ファイルを指定できます。

パターンにマッチした行を抽出

itemtext.txtに書かれているappleのある行がすべて抽出されます。

コマンド例

itemtext.txt

実行結果

端末(terminal)によってはcolorのオプションをつけると抽出したパターンが色付けされて、より分かりやすくなります。
例えば、

とするとappleという単語に色がついて、どこにappleという単語があるかがわかりやすくなります。

大文字と小文字を区別しない
(-iオプション)

-iオプションは、パターンの大文字と小文字を区別しないようになります。
どのような文字かだけがわかっている場合に利用することができます。
apt-cacheコマンドなどでパッケージを検索するときやシステム情報等を検索するときなどに便利です。
コマンド例では、sedコマンドで行の1番目にあるappleを大文字にしています。

コマンド例

itemtext.txt ▼表示

実行結果

複数のパターンを指定
(-eオプション)

-eオプションで指定するパターンを明示することができます。
また、-eオプションは複数つけることができ、複数つけると一致したパターンのいずれかが含まれていたら、その行が抽出されます。

コマンド例

itemtext.txt ▼表示

実行結果

複数のパターンをファイルで指定
(-fオプション)

-fオプションは複数のパターンはファイルによっても指定できます。
パターンの書き方は指定するパターンを一行ずつに分けて書きます。

コマンド例

pattern.txt

itemtext.txt ▼表示

実行結果

マッチしない行を抽出
(-vオプション)

-vオプションによって、appleに一致しない行が抽出されます。
余分なものをフィルタするときによく使われ、パイプなどで次のコマンドに渡す出力を制限するときに便利です。

コマンド例

itemtext.txt ▼表示

実行結果

行がパターンにそのまま一致する行を抽出
(-xオプション)

-xオプションは、行がパターンにそのまま一致するときにその行を抽出します。パターンの指定で正規表現で^と$でパターンを囲んだもの("^pattern$"のようなもの)と同じになります。

コマンド例

itemtext.txt ▼表示

実行結果 なし

別の例を出すと、以下のようになります。

コマンド例

x_opt.txt

実行結果

-xオプションはほかのコマンドと組み合わせて利用できます。
例えば、itemtext.txtの3列目にあるappleとyuzuの数を数えるとします。
それは、以下のようなコマンドで数えることができます。

コマンド例

または、一行、すなわちワンライナーで入力すると

実行結果

パターンにマッチした行数を数える
(-cオプション)

-cオプションでパターンにマッチした行数を数えることができます。

コマンド例

itemtext.txt ▼表示

実行結果

-vオプションを組み合わせると逆にパターンにマッチしなかった行数を数えることができます。
コマンド例

実行結果

パターンにマッチする行数を制限
(-mオプション)

-mオプションは、マッチした行数が指定した数値まで読み込むと、それ以降のそのファイルに対するパターンマッチングをストップします。

コマンド例

itemtext.txt ▼表示

実行結果

ファイルを複数選択していた場合の結果は、以下の通りになります。
ここで、itemtext2.txtはitemtext.txtのコピーになります。

コマンド例

実行結果

パターンにマッチした部分のみを抜き出す
(-oオプション)

-oオプションは、パターンにマッチした部分のみを抜き出します。出力にはマッチした部分が行に分かれて表示されます。

コマンド例

itemtext.txt ▼表示

実行結果

uniqコマンドと組み合わせれば、出てきたパターンの数を数え上げることができます。

コマンド例

実行結果

複数のパターンを指定している場合、uniqコマンドの前にsortコマンドを通すことで、それぞれのパターンについて、出てきた数を数え上げることができます。

コマンド例

実行結果

ファイル名を表示
(-Hオプション)

-Hオプションはパターンを検索したとき、パターンに一致した行と一緒にファイル名も一緒に表示します。
2つ以上のファイルに対して検索するとき、自動的にこのオプションはONになります。

コマンド例

itemtext.txt ▼表示

実行結果

ファイル名を表示しない
(-hオプション)

-hオプションはパターンに一致した行に対して、ファイル名を非表示にします。
ここでitemtext2.txtはitemtext.txtのコピーです。

通常、2つ以上のファイルに対して、grepコマンドを行うとパターンに一致した行と一緒にファイル名も表示されます。
しかし、-hオプションをつけることで、ファイル名を非表示にできます。

コマンド例

itemtext.txt ▼表示

実行結果

標準入力に渡されたものにラベルをつける
(--labelオプション)

--labelオプションは、標準入力から来た文字列に対して、ファイル名があるかのようにラベルをつけることができます。

まずは、標準入力でgrepコマンドに-Hオプションをつけて渡された時の出力を見ます。

コマンド例

itemtext.txt ▼表示

実行結果

この(standard input)に対して、別の名前を付けることができます。
それは、--labelというオプションでできます。

コマンド例

実行結果

grepで検索したパターンをファイルにどんどん追記していくときにラベルをつけておくと、どういう意図の出力された文字列かがわかるかもしれません。

パターンにマッチした部分の行番号を表示
(-nオプション)

-nオプションは、パターンに一致した部分の行番号を表示します。
コマンド例

itemtext.txt ▼表示

実行結果

-Hオプションと併用するとファイル名も表示することができます。
これでどのファイルのどの行がパターンに一致したかを把握することができます。

コマンド例

実行結果

パターンにマッチしているファイルを検索
(-lオプション)

lオプションは、パターンの後にファイル名を指定することでパターンにマッチした行ではなく、ファイルの名前を表示してくれます。

コマンド例

または

ディレクトリ構造

.(ドット)はカレントディレクトリです。
itemtext2.txtとitemtext-dir1.txtは、itemtext.txtのコピーになります。
また、empty.txtとempty-dir1.txtは何も書かれていないファイルとなります。

実行結果

ディレクトリを指定した場合に違うメッセージを出しますが、-sオプションを用いることでこのようなメッセージやエラーメッセージを表示させないようにすることができます。
コマンド例

または

実行結果

再帰的にパターンにマッチしているファイルを検索
(-rオプションと-lオプション)

-rオプションは、ファイルの代わりにディレクトリを指定して、再帰的にそれぞれのファイルに対して検索を行っていくオプションです。

コマンド例

または

ディレクトリ構造 ▼表示

実行結果

ディレクトリを指定しなければ、現在のディレクトリから再帰的に検索していきます。

コマンド例

実行結果

再帰的にファイルに対してパターンにマッチした行を検索
(-rオプション)

-rオプションは、ファイルの代わりにディレクトリを指定して、再帰的にそれぞれのファイルに対して検索を行っていくオプションです。
ディレクトリを指定しなければ、現在のディレクトリから再帰的に検索していきます。

コマンド例

itemtext.txt ▼表示

ディレクトリ構造 ▼表示

実行結果

ディレクトリを複数指定した場合は、入力した順番のディレクトリでファイルを再帰的に実行していきます。

コマンド例

実行結果

この例ではdir1を繰り返して、検索していますが実際に利用する際はこのような指定はしないと思います。

再帰的な検索から検索項目を除外
(--excludeオプション)
(--exclude-fromオプション)
(--exclude-dirオプション)

--excludeオプション

--excludeオプションは、検索から除外するファイルを指定します。指定するファイルについてはワイルドカードを使用できます。*.txtですべてのテキストファイルを検索から除外します。今回の例では出力は表示されません。

コマンド例

ディレクトリ構造 ▼表示

実行結果 なし

もし、itemtext.txtのコピーであるitemtext.datがあるならば、このコマンド例は以下のような実行結果になります。

実行結果 ▼表示


'{}'で複数のリストを指定することもできます。

この指定方法は

と等価なコマンドになります。
これはすべてのテキストファイルとすべてのデータファイルを除外することができます。

--exclude-fromオプション

--excludeオプションで除外するファイルは別のファイルにすることができます。
--exclude-fromオプションは、--excludeオプションで除外するファイルを別のファイルに書き込んで置き、そのファイルを読み込んで検索から除外することができます。

コマンド例

exclude-file.txt

ディレクトリ構造 ▼表示

実行結果 なし

--exclude-dirオプション

--exclude-dirオプションは検索から除外できるディレクトリを指定することができます。
ワイルドカードを用いた指定もできます。

コマンド例

ディレクトリ構造 ▼表示

実行結果 ▼表示

指定のファイルのみを検索
(--includeオプション)

--includeオプションは指定したファイルだけを検索します。
*.txtですべてのテキストファイルだけを検索します。
--excludeオプションと同じようにワイルドカードを用いて指定することができます。

コマンド例

ディレクトリ構造 ▼表示

実行結果

シンボリックリンクのディレクトリも再帰検索
(-Rオプション)

-Rオプションはシンボリックリンクの先のディレクトリやファイルも再帰検索するオプションです。通常の-rオプションではシンボリックリンクの先までは再帰検索を行いません。

-Rオプションで検索の除外をする際、-rオプションと扱いは同じになり、シンボリックリンクの先がディレクトリの場合は--exclude-dirオプションで、シンボリックリンクの先がファイルの場合は--excludeで除外することができます。

コマンド例

ディレクトリ構造 ▼表示

実行結果

この例ではあらかじめシンボリックリンクを準備しています。
dir1のシンボリックリンクのディレクトリはdir1_symです。
itemtext.txtのシンボリックリンクのファイルはitemtext_sym.txtです。
シンボリックリンクの作成コマンドはそれぞれ

になります。

絶対パスの確認コマンドは

または

になります。

パターンにマッチした行の後ろのn行を表示
(-Aオプション)

-Aオプションはパターンマッチングした行の後ろの行も表示することができます。
何行を表示するかは-Aオプションの後の数字で指定します。
この例では、3を指定したことでパターンマッチした行の後ろ3行分表示しています。

コマンド例

itemtext.txt ▼表示

実行結果

-Aオプションが設定されていても、grepコマンドは表示する行を何度も繰り返しません。

コマンド例

実行結果

パターンにマッチした行の前からn行を表示
(-Bオプション)

-Bオプションはパターンマッチングした行の前の行を表示することができます。
何行を表示するかは-Bオプションの後の数字で指定します。
この例では、3を指定したことでパターンマッチした行の前3行分表示しています。

コマンド例

itemtext.txt ▼表示

実行結果

-Bオプションが設定されていても、-Aオプションと同様にgrepコマンドは表示する行を何度も繰り返しません。

パターンにマッチした行の前後n行を表示
(-Cオプション)

-Cオプションはパターンマッチングした行の前後の行を表示することができます。
何行を表示するかは-Cオプションの後の数字で指定します。
この例では、3を指定したことでパターンマッチした行の前後3行分表示しています。

コマンド例

itemtext.txt ▼表示

実行結果

-Cオプションが設定されていても、-Aオプションと同様にgrepコマンドは表示する行を何度も繰り返しません。

前後に表示した時の行の区切り文字を変更
(--group-separator=string)

--group-separatorオプションは、-A,-B,-Cオプションの時に、パターンマッチした行の前後の表示で使われていた区切り文字を任意の文字列で変更することができます。

コマンド例

itemtext.txt ▼表示

実行結果

前後に表示したときの行の区切り文字を表示しない
(--no-group-separator)

--no-group-separatorオプションは、-A,-B,-Cオプションの時に、パターンマッチした行の前後の表示で使われていた区切り文字を表示しないようにすることができます。

コマンド例

itemtext.txt ▼表示

実行結果

参考

外部リンクGNU grepのマニュアル

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする