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


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

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

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2008/03/24 01:46:46
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:y-kawaz No.1

回答回数1422ベストアンサー獲得回数226

ポイント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

回答回数1422ベストアンサー獲得回数226ここでベストアンサー

ポイント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

回答回数291ベストアンサー獲得回数37

ポイント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

回答回数71ベストアンサー獲得回数12

ポイント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

回答回数70ベストアンサー獲得回数22

ポイント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

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

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

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

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

回答リクエストを送信したユーザーはいません