grepコマンドでファイル内に含まれる文字列を検索
ファイルの中身をチェックして、探したい文字列が含まれているかどうかを検索するコマンドがgrep
(Global Regular Expression Print)で、以下のように使う。
$ grep -r "検索したい文字列" 探したいファイルがあるパス
検索したい文字列がTanaka Taro
で、探したいファイルがあるパスが/home/documents
とした場合の使用例は、以下の通りである。
$ grep -r "Tanaka Taro" /home/documents
-r
オプションを付けることによって、/home/documents
のサブディレクトリ内のファイルまで検索される。
今度は、応用の検索パターンを試してみよう。
応用の検索パターンでは、正規表現を使って検索する。
検索したい文字列が、「田中太郎」「たなか太郎」「田中たろう」「たなかたろう」の4パターンだとする。
これをコマンドにすると、このように利用する。
$ grep -r -E "(田中|たなか)(太郎|たろう)" /home/documents
-E
オプションを付けることで、検索したい文字列を正規表現を使って検索することができる。
カタカナで「タナカタロウ」まで検索に含める場合は、
$ grep -r -E "(田中|たなか|タナカ)(太郎|たろう|タロウ)" /home/documents
のように、「|」で分割を増やせば良い。
姓名の間にスペースがあったりなかったりする場合がある。(「田中 太郎」とか)
その時は、*
や?
を使うと、検索したい文字列は次のように書ける。
(田中|たなか|タナカ) ?(太郎|たろう|タロウ)
(田中|たなか|タナカ) *(太郎|たろう|タロウ)
?
,*
はそれぞれ次のような意味を持っている。
?
: 直前の表現が0回か1回登場
*
: 直前の表現が0回以上連続して登場
つまり、上記の例に当てはめて考えると、?
を使うと「半角スペースが0回か1回登場」、*
を使うと「半角スペースが0回以上連続して登場」という意味となり、姓名の間に半角スペースが入っている場合も入っていない場合も検索することができる。
さらに、「Tanaka Taro」「tanaka taro」のように、アルファベット表記の名前も検索することになった場合、この時は、次のような方法で検索することができる。
$ grep -r -i -E "(田中|たなか|タナカ) *(太郎|たろう|タロウ)|tanaka +taro" /home/documents
-i
オプションは、大文字と小文字の区別無しで検索する。つまり、「Tanaka Taro」や「tanaka taro」だけではなく、「taNaka tAro」や「TaNaKa tarO」のような文字列もこの検索条件で引っかかるようになる。
また、正規表現の+
は次のような意味を持っている。
+
: 直前の表現が1回以上連続して登場
つまり、tanaka +taro
の場合、「tanaka」と「taro」の間に必ず半角スペースが1つ以上入っている文字列が検索対象となる。すなわち、「tanakataro」のような文字列は、「tanaka」と「taro」の間に半角スペースが入っていないので、検索結果として反映されない。
まとめ
grep
コマンドは、次のように使用する。
$ grep -r "検索したい文字列" 探したいファイルがあるパス
主なオプションには次のようなものがある。
-r
: 探したいファイルがあるパスとして指定したディレクトリが、さらに子ディレクトリを持っていた場合、子ディレクトリ内のファイルも再帰的に検索対象に含める。
-i
: 検索したい文字列の大文字と小文字の区別無しで検索する。
-E
: 正規表現を用いて文字列を検索したい場合に指定する。
grepに-rオプションを付けない場合
-r
オプションを付けずにgrep
コマンドを実行すると、「指定したファイルの中から、指定した内容を含む行を探す」という処理となる。
例えば、/home/user/access.log
からerror
が含まれる行を表示させたい場合は、次のコマンドを実行する。
$ grep "error" /home/user/access.log
パイプラインでless
コマンドに出力を渡せば、出力結果が画面外に溢れることも防げる。
$ grep "error" /home/user/access.log | less
パイプラインの使い方
出力を渡す側のコマンド | 出力を受け取る側のコマンド
パイプラインは、複数繋げることもできる
何かのコマンド | 何かのコマンド2 | 何かのコマンド3
-v
オプションを付けると、指定した文字列を含まない行を出力することができる。例えば、/home/user/access.log
からerror
が含まれない行を出力するためには、次のコマンドを実行する。
$ grep -v "error" /home/user/access.log
読み込みたいファイルが圧縮ファイルの場合
読み込みたいファイルが.gz
や.tgz
などの圧縮ファイルの時は、zcat
コマンドなどでファイルを展開しながら読み込むことができる。
$ zcat /home/user/access.log.gz | grep -v "error" /home/user/access.log | less
zcat: .gz
, .tgz
xzcat: .xz
unzip -p: .zip