【Linux】該当文字列を含むファイルを探すgrepコマンド
ことの始まり
サーバー上に残っているLOGから該当の処理を探す必要が出た。
普段サーバーの中からデータを漁ることなんてしなかったのでめちゃくちゃ手間取ったので、忘れないようにメモを残しておく。
grepコマンド
grep
の基本的な使い方はコレ。
grep 正規表現文字列 ファイル名
例えば~/Projects/hoge
ディレクトリ内にあるyasagori.txt
ファイルからfuga
という文字列を含む行探したければこうすればいい。
grep 'fuga' ~/Projects/hoge/yasagori.txt
ここでのfuga
は正規表現で、文字列を含む行を検索している。
1行に書かれている文字列がわかっているなら、シングルクォートは不要。
grepには色々なオプションが存在するので組み合わせると便利。
複数条件で検索
fuga
とpiyo
の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コマンド、調査とかを行うときはめっちゃ便利。
というか使えないと話にならない…