ファイルやディテクトリを検索するfindコマンド。
標準入力からにコマンドを作成するxargs。
これらを利用して、findで見つけたファイルのなかからgrepで必用な行を抜き出せます。
find
find [path] [検索条件]
-name ファイルやディレクトリのマッチング条件
-user 所有者を指定
-group グループを子弟
-atime n n日前に最終アクセスがあったファイル
-mtime n n日前に最終更新されたファイル
-empty 空のファイルやディレクトリを検索する
# find ./ -name "*.log" ./sub1/sub1.log ./sub2/sub2.log ./sub3/sub3.log ./dir.log
※注意 マッチング条件は””で囲みます。
※pathを/とすると、ルート配下(全てを対象)となります。
xargs
xxx | xargs [実行するコマンド]
引数を何も指定しないとechoになります # find ./ -name "*.log" | xargs ./sub1/sub1.log ./sub2/sub2.log ./sub3/sub3.log ./dir2.log ./dir.log logファイルだけを削除します # find ./ -name "*.log" | xargs rm 確認しながら削除したければ-iを付けます。 # find ./ -name "*.log" | xargs rm -i
grep
grep [検索文字列] [ファイル名]
grep "warn" /var/log/*.log ・大文字小文字を区別しない # grep -i failed /var/log/messages ・一致した文字に色を付ける grep -i --color error /var/log/messages ・検索文字をor条件で複数指定する grep -i --color -e error -e fail /var/log/messages grep -i --color "error\|times" /var/log/messages
find + xargs + grep
find,xargs,grepを組み合わせると、指定したディレクトリ配下のファイルを検索できます。
エラーのあったログを検索する、検索結果をさらに日付でソートするなど非常に応用ができます。
grepだけだとサブディテクトリまで検索できません。
503エラー(403バイト)の行を抜き出す # find ./ -name "*.log" | xargs grep "503 403" さらに対象行の18文字目からの日付を抜き出しソートします。(18文字めからがからが日付だとする) # find ./ -name "*.log" | xargs grep "503 403" | cut -c18- | sort -cx : 5文字目のみ -cx-y : x~y文字目 -c-x : 先頭からx文字 -cx- : x文字目以降