質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CDN

CDNは、Webコンテンツをインターネット経由で配信するのに最適化されたネットワークを指します。Webサイトにある静的コンテンツをWebサイトが管理されているサーバーとは異なるサーバーにキャッシュし代わりに配信することで、負荷が分散し速度を向上する仕組みです。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

Q&A

解決済

4回答

3385閲覧

UTC→JSTに読み替えて集計

ike_snj

総合スコア5

CDN

CDNは、Webコンテンツをインターネット経由で配信するのに最適化されたネットワークを指します。Webサイトにある静的コンテンツをWebサイトが管理されているサーバーとは異なるサーバーにキャッシュし代わりに配信することで、負荷が分散し速度を向上する仕組みです。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

0グッド

0クリップ

投稿2020/06/17 07:16

編集2020/06/17 12:18

UTC時刻で出力されているアクセスログをJSTに読み替えて集計したいのですが、いい方法なないでしょうか。

以下のようなファイルが出力されるので、先頭の(20200501)が日付でファイル名で集計してました。
20200501T000000.000-WstSAefuOVd4ZYO34n94.log.gz
20200531T230000.000-WstSAefuOVd4ZYO34n94.log.gz

bash

1#!/bin/sh 2 3################################################# 4##File list with 50 or more access to / xyz / std ${YEAR} 5################################################# 6 7YEAR=$(date "+%Y") 8MM=$1 9SECONDS=0 10LOGFILE="/tmp/js_`date +%Y%m%d_%H%M%S`.log" 11 12exec > "${LOGFILE}" 13exec 2>&1 14 15if [ "$#" -ne 1 ]; then 16 echo "Argument error!" 17 exit 1 18elif [[ ! "$MM" =~ [0-1][0-9] ]]; then 19 echo "Argument error!" 20 echo "Enter the month!" 21 exit 1 22fi 23 24test -f ${YEAR}-${MM}-${i}.json && echo "already exists ${YEAR}-${MM}-${i}.json" && exit 1 25 26for i in 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 27do 28zcat "${YEAR}${MM}${i}"*.log.gz | awk -F \" '{print $8}' | 29grep -E "/xyz/std/[0-9]*/[0-9]*/[0-9]*.png$" | 30cut -d "?" -f 1 |cut -d "%" -f 1 |cut -d "#" -f 1 | 31sort |uniq -c |awk '$1 >= 50 {print $2","$1}' > ${YEAR}-${MM}-${i}.json 32 33sed -i -e "s/^/[\"/g" ${YEAR}-${MM}-${i}.json 34sed -i -e "s/.png/.png\"/g" ${YEAR}-${MM}-${i}.json 35sed -i -e "s/$/],/g" ${YEAR}-${MM}-${i}.json 36sed -i -e "1i {addressPoints:[" ${YEAR}-${MM}-${i}.json 37sed -i -e "$ s/],/]]}/g" ${YEAR}-${MM}-${i}.json 38done 39 40echo "[INFO] Script time is ${SECONDS}sec."

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2020/06/17 10:50

どの単位での集計でしょうか?1時間?1日?
ike_snj

2020/06/17 10:51

1日です。
guest

回答4

0

ベストアンサー

どの単位での集計でしょうか?1時間?1日?

1日です。

日付と時刻をそれぞれ認識した後で、15時以降だと翌日にカウントすれば良いです。

#追記
なんと、日ごとにファイルが分かれているんですね。
前日ファイルの15時以降と、当日ファイルの15時以前を処理するようにします。

sh

1前略 2for i in 01 02 中略 30 31 3do 4YESTERDAY=`date +%Y%m%d -d "$YY-$MM-$i - 1day"` 5( zcat $YESTERDAY*.log.gz | awk '$3 >= 15'; 6 zcat $YY$MM$i*.log.gz | awk '$3 < 15' ) | awk -F \" '{print $8}' | 7後略

なお、for i in 01 02 ・・・ 31はBashならfor i in {01..31}と書けます。
また、小の月なら31日分が存在しないのでエラーで止まりますよね?不都合ないのなら良いですが。
他にも改善できるところはあります。

投稿2020/06/17 11:01

編集2020/06/17 15:53
otn

総合スコア84503

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ike_snj

2020/06/17 11:29

それをシェルでやろうとしてるので、その集計方法を知りたいです。
otn

2020/06/17 11:35

UTC基準での集計は出来ていると言うことだと思うので、そのコードを質問に追記してください。 それへの修正で書きます。
guest

0

えっと、GNUのdateコマンドで変換はできるので、あとはperlでやればいいかと。タイムゾーン設定がJSTになっていることが条件です。

  1. 切り出した日時文字列に" UTC"を追加してdateコマンドでunix timeに変換

hoge=$(date -d "2020-04-30 14:52:54 UTC" +%s)

  1. 得られたunix timeから現在のタイムゾーン(JST)に変換

date -d @$hoge "+%Y-%m-%d %H:%M:%S"

投稿2020/06/17 10:48

Daregada

総合スコア11990

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ike_snj

2020/06/17 12:04

ありがとうございます。 例えばどういったperlコードを書いたらいいでしょうか。
guest

0

9時間加えればJSTになりますよ

投稿2020/06/17 07:18

y_waiwai

総合スコア87749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Excelを用いて+9:00計算で集計するでは駄目ですか?

投稿2020/06/17 07:18

over

総合スコア4309

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ike_snj

2020/06/17 07:28

以下フォーマットのログが1ヶ月300GB程度あり、これをJSTに読み替えて、日毎のリファラー別、アクセス先ファイル等を集計が必要で、bashシェルやperlでやろうとしてますが、いい方法がみつからずないかという質問でした。 222.222.22.2 2020-04-30 14:52:54 "GET /9/459/194.png HTTP/1.1" 200 "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:75.0) Gecko/20100101 Firefox/75.0" "https://xx.jp/" "/xyz/xyz/194.png?_=20200402a"
over

2020/06/17 07:42

OSのタイムゾーンを変更するのも不可である場合はスクリプトで対応するしかないですね。 スクリプトにおけるUTC→JST変換のアルゴリズムをお尋ねされています?
ike_snj

2020/06/17 08:50

そうです。日別に出したいので、例えば”2020-04-30 15:00:54”の行のログは5月1日分で集計するといった方法がありますか。 CDN
over

2020/06/17 08:57 編集

どこで区切るかですが、「0:00」がスタートだとした場合、UTC時刻に+9:00を行った際、「23:59:59」を超えたら翌日カウントで良いのでは?
ike_snj

2020/06/17 09:29

はいその場合、翌日カウントでいいです。 上記の例はそういう意味でした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問