Unix,Linuxで使えるコマンドラインの覚書です。使えそうなコマンドがあれば、随時更新していこうと思います。もし、間違いなどありましたら、連絡いただけると助かります。

申し訳ないですが、コマンドを実行した結果は保証しません。ご自分の責任でお願いします。 <( )>

覚書

目次

  1. アクセスログの中からトップ10のファイル名を表示する
  2. find で検索してマッチしたファイルを cp する
  3. find で検索して、条件にマッチしたファイルだけ、ファイル名を変更する
  4. 正規表現で検索して、マッチした部分だけを表示する

アクセスログの中からトップ10のファイル名を表示する

for x in `cat access_log | awk '{print $7}' | sort | uniq`; do \ 
grep $x access_log | wc -l | tr -d '\n'; \
echo "  $x"; \
done | sort +0 -rn | head -10

for 文は「for 変数 in 単語リスト; do コマンド done」の構文で使います。 変数はコマンドのところで使えます。$変数 のようにすると呼び出すことができます。

」で囲まれた部分は、囲まれた中をコマンドとして実行し、その結果を返すものです。 access_log を開いて、その中の空白で区切られた単語の区切りの7番目をawkによって抽出し( awk ‘{print $7}’)、その結果を一意なものにしています。

上記のコマンドによってできた単語リスト(ここでは、ファイル名のリストを取得しているつもり)を繰り返し処理していきます。最初に、取得したファイル名を含む行数を「grep $x access_log | wc -l 」で取り出します。 wc の結果には改行が含まれるので 「tr -d ‘\n’」で改行を削除しています。「tr」コマンドの -d オプションは、その次にくる文字を削除するオプションです。オプションをつけずに2つ渡すと置換になります。

「tr ‘GET’ ‘POST’」とすると、最初の引数の各文字に対応する第2引数の文字が置換されます。つまり、 文章中に HTTP とある場合、この置換をかけると HSSP と変換されてしまいます。

ファイル中に現れる行数を最初に出力した後で、 echo でファイル名を出力しています。forループを抜けた後、これまで処理した結果を sort しています。 +0 オプションは、1番目の単語でソートするオプションです。 +3 とすると 4単語目でソートすることになります。 -r オプションは、逆順(降順)でソートするオプションです。 -n は、ソート項目を数字として判断するオプションです。

最後に、「head -10 」として 最初の10件を取り出しています。

[参考]

Linuxサーバ Hacks P.16

find で検索してマッチしたファイルを mv する

for x in `find . | grep ".*.txt"`; do \
echo "$x" "/home/hamasyou/$x"; \
done | xargs -n2 cp

「find」コマンドで、カレントディレクトリから .txtで終わるファイルを見つけ出します。見つかったファイルを echo で 元のファイル名 移動先 というように出力します。この結果を xargs で取り込み、 -n数字 オプションによって引数を2つとるようにします。

これを cp コマンドに引き渡すことで、echo で出力した場所にファイルをコピーすることができました。

find で検索して、条件にマッチしたファイルだけ、ファイル名を変更する

find . | grep ".*.java" | sed -n 's/\(.*\)\.java/mv & \1.vm/p' |sh

find と grep で、拡張子が .java のファイルを検索します。マッチしたファイル名を sed に送り込み、/s 関数を使ってファイル名を置換したものを mv コマンドに見えるように出力します。その結果を パイプでつないで sh に渡します。

sed の -n オプションは読み込んだ行を表示しないというオプションです。 s//p 関数で .java 拡張子を持つファイル名を、 「mv 読み込みファイル名 マッチした部分.vm」 という出力になるように置換して、 p コマンドで出力しています。

s関数中にある & は 読み込んだファイル名を返す参照変数です。

[参考]

新TheUNIX SuperText[上]

正規表現で検索して、マッチした部分だけを表示する

find . | grep '.*.java' | xargs cat | sed -n 's/.*\(キーワード\).*/\1/p'

find と grep で拡張子が .java のファイルを取得し、ファイルの中身を cat で表示します。その結果を sed に送り、キーワードのみを後方参照として取得できるようにしておきます。 s//p 関数で中で \1 を使ってマッチしたキーワードのみを出力するようにしています。