grepでディレクトリ配下のファイルを検索し、詳細を表示する

今日はよく使うgrepコマンド。備忘録。
調査などでもよく使いますよね。
grepコマンドについて

では、まずは、標題のディレクトリ配下のファイル内を検索して、詳細を表示する方法。
ディレクトリ配下を再帰的に検索する時は、rオプション。

grep -r 検索文字列 ディレクトリ

-lでバイナリ除外
grep -rl 'test' /tmp/test/

ただ、これだとファイル名一覧は出るのですが、作成日時やユーザー情報などが表示されません。
なので、|(パイプ)で、lsに結果を渡してあげます。

grep -rl 'test' /tmp/test/ | xargs ls -altr

ls -a ドットファイル含む全てを表示
ls -l 1行に1ファイルずつ表示
ls -t タイムスタンプでソート
ls -r リバース(逆順)にソート

はい。これで詳細まで表示できました。

せっかくなので、他にもよく使うオプションを。

前後の行を表示する!
これね、ログからエラーとか検索したい時、いつ?というのが欲しいわけで、
そういう時は、時間表示されてる前後の行も表示すると便利。
そして、とても簡単。

grep -5 'error' /var/logs/test.log


-5で前後5行。
ちなみに、-A 5にすると、後ろの5行。-B 5にすると、前の5行。
それから、-nオプションで、行番号を表示します。
全部の検索結果ではなく、最近のものだけ確認したい時は、tailに渡してあげます。

grep -5 'error' /var/logs/test.log | tail -100


これで、検索結果の直近100行が表示されます。

さ、次は、特定のファイルに対してだけ、grepしたい時!
例えば、/tmp/test/配下のtest.logからのみ検索する時。
test配下のサブディレクトリにtest.logがたくさんあって、、といった時に便利ですね!

find /tmp/test/ -name test.log | xargs grep 'test'


findで検索したファイルをgrepに渡してあげます。
これで、/tmp/test/test.logも/tmp/test/sub/test.logも全て検索対象にできます。

さて、そろそろ最後にしますか。
少し系統を変えて、今度は特定のプロセスだけ取得する場合。
例えば、自作のjavaのバッチプロセスを確認したい時など。

ps aux | grep jsvc


ま、このへんは定番ですよね。もちろん、ps -efでもOK。
多少、表示される内容が違いますが、プロセス確認なら、auxか-efは定番ですね。
で、さらに、javaプロセス全部ではなくて、grepしてる自分は除外したいなー、という時は、

ps aux | grep jsvc | grep -v grep


そうです。単純に、grepに渡して、-vオプションで対象を除外。
除外対象が複数ある場合は、grep -v -e grep -e tomcatといった感じで、-eで複数指定できます。
さらに、プロセスIDだけ取得したい場合。
シェルスクリプトなんかで使ったりすると便利ですね。
こんな感じ。

ps aux | grep jsvc | grep -v -e grep -e tomcat | awk '{print $2;}'


はい。パイプで繋いで繋いで、これで、プロセスIDだけ取得できます。
もちろん、結果が複数ある場合は、その分のプロセスIDが取得されます。
あとは、例えば、シェル内で、結果を変数に入れて、forとかで、処理を回してあげれば、
取得したプロセスIDに対していくつも処理できます。

TEST_PIDS=(`ps aux | grep jsvc | grep -v -e grep -e tomcat | awk '{print $2;}'`)
for pid in ${TEST_PIDS[*]}
do
  kill -9 ${pid}
done


こんな感じで取得したプロセスを全部killしたり。ま、やり方はいかほどにも。

ということで、今日はこんなところにしておきます。
本日もお疲れ様でしたー!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です