apacheで出力されるアクセスログをn分の1だけ出力したいです。200万行あれば、(n=2の場合なら)1行飛ばしずつで、100万行のアクセスログファイルにしたいです。方法と具体的なサンプルスクリプトを教えて下さい。


(1)apacheの設定ファイルを変更する
簡単でうれしいですが、拡張子で絞る以外に方法を知りません。拡張子で絞るのはNGです。
(2)apacheから出されたログを、シェルスクリプト等でn分の1にする。
これが一番現実的。参考シェルスクリプトを教えて下さい。

以上が検討している方法です。

回答の条件
  • 1人2回まで
  • 登録:2008/03/23 03:26:52
  • 終了:2008/03/24 01:46:46

ベストアンサー

id:y-kawaz No.1

y-kawaz回答回数1420ベストアンサー獲得回数2252008/03/23 12:55:58

ポイント30pt

以下のようにしてやればログを5分の1に出来ますが、こんなんで良いでしょうか?

cat access_log | perl -pe'$a=++$a%5;$_=$a==0?$_:""' > access_log2
id:redhat

ワンライナースクリプトありがとうございます!早速使わせて頂きます。

2008/03/24 01:45:12

その他の回答(3件)

id:y-kawaz No.1

y-kawaz回答回数1420ベストアンサー獲得回数2252008/03/23 12:55:58ここでベストアンサー

ポイント30pt

以下のようにしてやればログを5分の1に出来ますが、こんなんで良いでしょうか?

cat access_log | perl -pe'$a=++$a%5;$_=$a==0?$_:""' > access_log2
id:redhat

ワンライナースクリプトありがとうございます!早速使わせて頂きます。

2008/03/24 01:45:12
id:toohigh No.2

toohigh回答回数291ベストアンサー獲得回数372008/03/23 06:56:26

ポイント20pt

TransferLog "|usr/bin/sed -n 'n;p' |/usr/local/apache/bin/rotatelogs /usr/local/apache/logs/access_log 86400"

・・・とかいかがでしょうか。

(1)の方法で、ログ出力を外部コマンド任せにしておいて、sed で間引く、という方法になります。

id:redhat

なるほど。勉強になります。ありがとうございます。

2008/03/24 01:45:36
id:khoshi3 No.3

khoshi3回答回数71ベストアンサー獲得回数122008/03/23 05:25:45

ポイント20pt

シェルスクリプトではありませんが、こんなperlスクリプトではいかがでしょうか? ご希望の処理は6行目だけで後は数値指定ですが。

  • thin.pl (先頭の数値は行番号)

 1  #!/usr/bin/perl

 2  use Getopt::Std;

 3  getopt('t:o:');

 4  $thin = $opt_t || 2;

 5  $offset = $opt_o || 0;

 6  while (<>) { print if (($. - 1) % $thin == $offset); }

  • cat access_log | ./thin.pl -t2 : 1行おきに表示(1,3,5,…行)
  • cat access_log | ./thin.pl -t3 : 2行おきに表示(1,4,7,…行)
  • cat access_log | ./thin.pl -t3 -o1 : 2行おきに表示(2,5,8,…行)

こんな感じです。

ちなみに私だったらめんどくさいのでスクリプト無しでコマンドラインで以下のような感じで使いそうな気がします。:

cat access_log | perl -ne 'print unless($. % 3)' ## 2行おきに表示(1,4,7,…行)

id:redhat

ありがとうございます!使わせて頂きます。

2008/03/24 01:45:52
id:mjy No.4

mjy回答回数67ベストアンサー獲得回数202008/03/23 10:10:45

ポイント20pt

n が4のとき

sed -n 1~4p

あるいは、

#! /usr/bin/env bash
n=4 # n行につき、最初の行を出力する

l=0
while read ; do
    l=$((l + 1))
    if [ $l -eq 1 ]; then echo "$REPLY"; fi
    if [ $l -eq $n ]; then l=0; fi
done
id:redhat

ありがとうございます。上の方のスクリプトとあわせて使わせて頂きます。

2008/03/24 01:46:11

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません