Linuxにおけるgrepコマンドの使い方

Grepは、指定されたファイルの内容を検索し、指定されたパターンに一致する行をデフォルトで出力します。Grepは一致する内容を検索できますが、その内容を置き換えることはできません。

基本的な構文

構文の形式:

grep [オプション] パターン [ファイル1 ファイル2 ...]
grep [オプション] [-e パターン | -f ファイル1] [ファイル2 ...]

GrepはBRE(基本正規表現)、ERE(拡張正規表現)、PRE(Perl互換正規表現)などの異なるマッチングモードをサポートしています。

通常の場合、デフォルトのBREモードを使用すれば十分です。このモードでは、サポートされる正規表現の文法が限られています。より高度な正規表現が必要な場合は、EREモードを使用します。さらに複雑な正規表現を使用したい場合、PREモードを選択します。

一般的なオプション:

--help
-V, --version
-G, --basic-regexp        BREモード、デフォルトモード
-E, --extended-regexp     EREモード
-P, --perl-regexp         PREモード
-F, --fixed-strings       指定したパターンを文字列として解釈
-f, --file=FILE           正規表現をファイルから読み込む
-i  大小文字を無視
-o  一致部分のみ出力
-v  反転選択、一致しない行を出力
-c  一致する行の数を計算
-n  行番号も一緒に出力

BRE正規表現:

基本正規表現(BRE)では、+、{、|、(、)といった記号は特別な意味を持たず、元の意味を取り戻すにはバックスラッシュ()を前置する必要があります。

特殊文字を含む式の場合、二重引用符で囲むことを推奨します。単純な文字列の場合は必要ありません。

EREと比較すると、BREの最大の違いは、多くのメタ文字をサポートしていない点です。例えば、BREでは\が必要ですが、EREでは不要です。

構文 説明 詳細
. 任意の一文字に一致 [ ]内では.はメタ文字ではない
^ 行の先頭 ^や$は位置を表し、具体的なテキストではない
$ 行の末尾 ^や$は位置を表し、具体的なテキストではない
* ゼロ回またはそれ以上の繰り返しに一致 直前の表現をゼロ回以上繰り返したものに一致
[] 指定された一文字に一致 例:[0-9]、[a-z]、[A-Z]
[^...] 除外型文字グループ 指定されていない任意の一文字に一致
\? オプション要素 一度だけ出現または出現しない
\+ 一回以上に一致 直前の表現を少なくとも一つ以上繰り返したものに一致
\{min,max\} 量詞範囲 最小値から最大値までの繰り返しに一致
\| または(多選構造) bob\|nickのように複数のパターンに一致
\(\) グループ化 括弧内のサブ表現を「覚えて」おく
\<\> 単語境界 単語の開始・終了位置を示す
\ エスケープ文字 メタ文字自体を一致させるためのエスケープ
名前付き文字クラス 予め定義された文字クラス [[:upper:]] [A-Z] [[:lower:]] [a-z] [[:digit:]] [0-9] [[:alnum:]] [0-9a-zA-Z] [[:space:]] 空白やタブ [[:alpha:]] [a-zA-Z]
[user@localhost tasks]$ echo "aaaaabbbb" | grep "a{5}" // { と } をエスケープしないと普通の文字列として扱われる
[user@localhost tasks]$ echo "aaaaabbbb" | grep a\{5\}   // 特殊文字をエスケープしてクォートなし
[user@localhost tasks]$ echo "aaaaabbbb" | grep "a\{5\}" // エスケープとクォートを使用して正常に動作
aaaaabbbb<br></br>

よくある使用例

textA.txt

textA
aaaaaa
aaa
bbbbbb
ccccccc
dddddd
AAAAAA
AAA
aaabbb
AAABBB
aaabbb
aaa   bbb
AAA bbb                ccc
textA

textB.txt

textB
aaaaaa
aaa
bbbbbb
ccccccc
dddddd
AAAAAA
AAA
aaabbb
AAABBB
aaabbb
aaa   bbb
AAA bbb                ccc
textB
  1. 単一ファイル内の一致する行を検索
[user@localhost tasks]$ grep "aaa" textA.txt   // 一つのファイルを検索し、一致する行のみ出力
aaaaaa
aaa
aaabbb
aaabbb
aaa   bbb
  1. 複数ファイル内の一致する行を検索
[user@localhost tasks]$ grep "aaa" textA.txt textB.txt  // 複数ファイルを検索し、ファイル名とともに一致する行を出力
textA.txt:aaaaaa
textA.txt:aaa
textA.txt:aaabbb
textA.txt:aaabbb
textA.txt:aaa   bbb
textB.txt:aaaaaa
textB.txt:aaa
textB.txt:aaabbb
textB.txt:aaabbb
textB.txt:aaa   bbb
  1. 指定ディレクトリ内のすべてのファイルを検索
[user@localhost tasks]$ grep "aaa" ./*   // 通配符*が必要、さもないとエラー
grep: ./logs: Is a directory
./textA.txt:aaaaaa
./textA.txt:aaa
./textA.txt:aaabbb
./textA.txt:aaabbb
./textA.txt:aaa   bbb
./textB.txt:aaaaaa
./textB.txt:aaa
./textB.txt:aaabbb
./textB.txt:aaabbb
./textB.txt:aaa   bbb
  1. 再帰的にディレクトリ内のすべてのファイルを検索
$ grep -r --exclude-dir='.git' 'email' 
$ grep -r --exclude-dir={.git,xgit} 'email' 

再帰検索中に特定のディレクトリを除外するには --exclude-dir オプションを使用します。

$ grep -r --exclude=*.txt 'email' .

再帰検索中に特定のファイルを除外するには --exclude オプションを使用します。

[user@localhost tasks]$ grep -rl "aaa" ./ //一致する行があるファイル名のみ表示
./textA.txt
./textB.txt
  1. 一致する行の行番号も一緒に出力
[user@localhost tasks]$ grep -n "aaa" textA.txt
2:aaaaaa
3:aaa
9:aaabbb
11:aaabbb
12:aaa   bbb
  1. 大小文字を無視して検索
[user@localhost tasks]$ grep -i "aaa" textA.txt
aaaaaa
aaa
AAAAAA
AAA
aaabbb
AAABBB
aaabbb
aaa   bbb
AAA bbb                ccc
  1. 一致する文字列のみ出力
[user@localhost tasks]$ grep -o "aaa" textA.txt
aaa
aaa
aaa
aaa
aaa
aaa
  1. 特殊文字を含む検索
[user@localhost tasks]$ (echo aaa; echo ".*"; echo bbb)|grep ".*" //".*"は任意の長さの文字列に一致
aaa
.*
bbb
[user@localhost tasks]$ (echo aaa; echo ".*"; echo bbb)|grep "\.\*" //特殊文字をエスケープ
.*
[user@localhost tasks]$ (echo aaa; echo ".*"; echo bbb)|grep -F ".*" //固定文字列として扱う
.*
  1. 一致する行の数をカウント
[user@localhost tasks]$ grep -c "aaa" textA.txt
5
  1. 反転一致
[user@localhost tasks]$ grep -v "aaa" textA.txt
textA
bbbbbb
ccccccc
dddddd
AAAAAA
AAA
AAABBB
AAA bbb                ccc
textA
  1. ファイルから正規表現を読み込み
textA
a\{3\}
ccc
[user@localhost tasks]$ grep -f pattern.txt textA.txt
textA
aaaaaa
aaa
ccccccc
aaabbb
aaabbb
aaa   bbb
AAA bbb                ccc
textA
  1. 完全一致する行のみを検索
[user@localhost tasks]$ grep -x "aaa" textA.txt
aaa
  1. 完全一致する単語のみを検索
[user@localhost tasks]$ grep -w "aaa" textA.txt
aaa
aaa   bbb

タグ: linux grep 正規表現 シェルスクリプト

5月23日 10:47 投稿