【Linux】該当文字列を含むファイルを探すgrepコマンド

ことの始まり

サーバー上に残っているLOGから該当の処理を探す必要が出た。
普段サーバーの中からデータを漁ることなんてしなかったのでめちゃくちゃ手間取ったので、忘れないようにメモを残しておく。

grepコマンド

grepの基本的な使い方はコレ。

grep 正規表現文字列 ファイル名

例えば~/Projects/hogeディレクトリ内にあるyasagori.txtファイルからfugaという文字列を含む行探したければこうすればいい。

grep 'fuga' ~/Projects/hoge/yasagori.txt

ここでのfugaは正規表現で、文字列を含む行を検索している。
1行に書かれている文字列がわかっているなら、シングルクォートは不要。
grepには色々なオプションが存在するので組み合わせると便利。

複数条件で検索

fugapiyoの2つの文字列を含む行を探すには、パイプで繋いであげれば良い

grep 'fuga' yasagori.txt | grep 'piyo'

含まない検索

'fuga'は含むがpiyoは含まない行を探すには-vオプションを使う。

grep 'fuga' yasagori.txt | grep -v 'piyo'

複数ファイルから検索

指定のディレクトリ以下にあるファイル・ディレクトリから検索をしたいときは、次のように書いてあげれば良い。

# Projects以下にあるファイルから検索
grep 'fuga' ~/Projects/*

grepと一緒に使うと便利なコマンド

コレだけでもかなり便利なコマンドだが、組み合わせるとさらに便利な使い方ができる。

findコマンド

findはファイルを検索するコマンド。
grepと組み合わせることで「ディレクトリ以下にある一致する文字列を含むファイルから該当の行」をそれぞれ出すことができるようになる。

# Projectsディレクトリ内にある全てのファイル(さらに一階層したのディレクトリ内とかも)から探す
grep 'fuga' `find ~/Projects/* -type f`

検索条件が1つならfindを先頭に持ってきたこの書き方の方が便利。

find ~/Projects -type f -exec grep "fuga" {} \;

便利な理由は、「出力結果にフォルダ名とかを出さないで済む」から。

wcコマンド

wcコマンドは行数・単語数・バイト数を数えるコマンド。
grepした結果が多い場合、コレを使うことで該当箇所がいくつあるのかわかる。

grep 'fuga' `find ~/Projects/* -type f` | grep -v 'piyo' | wc
=>   33695 2462550 53006581
# この場合該当箇所が33695行あるということ。

teeコマンド

teeは出力しながら指定したファイルに書き出すコマンド。
grepで複数条件検索すると通常の>で書き出せないのでコレを使った。

pwd
=> ~/Projects
grep 'fuga' `find ~/Projects/* -type f` | grep -v 'piyo' | tee yasagori_2.txt
# ~/Projects/yasagori_2.txtが新たに作成されてgrepの検索結果が中に保存される

まとめ

普段あまり使ってこなかったgrepコマンド、調査とかを行うときはめっちゃ便利。
というか使えないと話にならない…