人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

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

●質問者: redhat
●カテゴリ:インターネット ウェブ制作
✍キーワード:Apache ng アクセスログ シェルスクリプト スクリプト
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● y-kawaz
●30ポイント ベストアンサー

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

cat access_log | perl -pe'$a=++$a%5;$_=$a==0?$_:""' > access_log2
◎質問者からの返答

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


2 ● toohigh
●20ポイント

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

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

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

◎質問者からの返答

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


3 ● khoshi3
●20ポイント

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

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 | perl -ne 'print unless($. % 3)' ## 2行おきに表示(1,4,7,…行)

◎質問者からの返答

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


4 ● mjy
●20ポイント

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
◎質問者からの返答

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ