【シェルスクリプト】10分単位でログを抽出して何かする

hiroroooo299 58views 更新:2017年6月14日

愚直に時間文字列を生成してログファイル全体からgrepして抽出しているので、ログファイルがでかいと死にます

本気でログ解析したければもう少し頭を使うか、他の手段を考えましょう。 例えば、 Amazon Athena とか Elasticsearch+Kibana とか。

それほど大きくなければ、こっそりエイヤッと….

START_DATE="$1"
END_DATE="$2"
TARGET_LOG_FILENAME="$3"
DATE_FORMAT="+%d/%b/%Y:%H:%M"
DATE_STR_LENGTH=$(expr $(LANG=C date "$DATE_FORMAT" | wc -m) - 2)

date_diff_second=$(expr $(date --date "$END_DATE" "+%s") - $(date --date "$START_DATE" "+%s"))
date_diff_minute=$(expr $date_diff_second / 60)

for i in $(seq 0 10 $date_diff_minute); do
    datetime_window=$(LANG=C date --date "$START_DATE ${i}minutes" "$DATE_FORMAT" | cut -c "-${DATE_STR_LENGTH}")

    echo "##### ${datetime_window} #####"

    # ↓適宜弄る
    ls -1 ${TARGET_LOG_FILENAME}* | grep -v ".gz" | xargs cat | grep "$datetime_window" | grep -v -e "127.0.0." -e "localhost" | grep "wp-admin" | wc -l

    echo
done
# 例: wp-adminへのアクセス回数計算

# START_DATE="2017-06-12 11:30:00 JST"
# END_DATE="2017-06-13 11:30:00 JST"
# TARGET_LOG_FILE="/var/log/nginx/access.log"
# ./grep_log.sh "$START_DATE" "$END_DATE" "$TARGET_LOG_FILE"

.
.
.
##### 13/Jun/2017:11:0 #####
154

##### 13/Jun/2017:11:1 #####
132

##### 13/Jun/2017:11:2 #####
159

##### 13/Jun/2017:11:3 #####
131

ログイン / 新規登録してコメントする

このソースコードをストックして後で利用したり、作業に利用したソースコードをまとめることができます。

こちらもお役に立つかもしれません