今日はよく使う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したり。ま、やり方はいかほどにも。
ということで、今日はこんなところにしておきます。
本日もお疲れ様でしたー!