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

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

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

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

Q&A

解決済

2回答

2837閲覧

アクセスの集計をするスクリプトを作成したいのですが・・

natsu25

総合スコア46

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

0グッド

1クリップ

投稿2017/06/01 02:29

編集2017/06/01 03:50

下記のような1日1回動くアクセス集計スクリプトを作成しております。
for文の外での変数の使い方とサーバごとの合算の仕方が分からないためご教授お願いできますでしょうか。

bash

1#!/bin/bash 2accesslog=/apache/logs/access_log 3host='111.11.111.11 222.22.222.22' 4yesterday=`date -d '-1 day' +%Y-%m-%d` 5today=`date +%Y-%m-%d` 6logfile=("$accesslog.$yesterday" "$accesslog.$today") 7 8for j in $host 9do 10for i in ${logfile[@]} 11do 12result=`ssh $j grep -v txt $i | wc -l` #ヘルスチェックリクエスト以外のアクセスの集計 13 if [ $result -gt 0 ];then 14 #ここに①の処理を入れたい 15 fi 16done 17 18if [ $result -gt 0 ];then 19 echo -e " $j アクセス件数:$result件" #②ここにサーバごとのアクセスの集計を出したいが変数$resultが引き継げない 20fi 21done

今の段階だと$resultが取れていないため1行しか出力されないので4件のログファイルをサーバごとに合算しサーバ数分のみで出力されるようにしたいです。
説明が下手で恐縮ですが宜しくお願い致します。

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

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

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

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

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

guest

回答2

0

ベストアンサー

結果を配列にいれてみました。

sh

1#!/bin/bash 2accesslog=/apache/logs/access_log 3host='111.11.111.11 222.22.222.22' 4yesterday=`date -d '-1 day' +%Y-%m-%d` 5today=`date +%Y-%m-%d` 6logfile=("$accesslog.$yesterday" "$accesslog.$today") 7 8for j in $host 9do 10 results=() 11 for i in ${logfile[@]} 12 do 13 result=`ssh $j "grep -v txt $i | wc -l"` #ヘルスチェックリクエスト以外のアクセスの集計 14 if [ $result -gt 0 ];then 15 results+=($result) #ここに①の処理を入れたい 16 fi 17 done 18 19 for r in ${results[@]} 20 do 21 echo -e " $j アクセス件数:$r件" #②ここにサーバごとのアクセスの集計を出したいが変数$resultが引き継げない 22 done 23 24done

投稿2017/06/01 04:03

A.Ichi

総合スコア4070

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

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

0

bashの変数は基本的にグローバルなので「$resultが取れていない」ことはないはずですね。ループ内に問題があってそもそも最初からresultに値が入っていないとかいうことはないでしょうか。

簡略化したスクリプトを作ってみました。

#!/bin/bash host=("host1") logfile=("log1" "log2") for j in $host do for i in ${logfile[@]} do result=100 #ヘルスチェックリクエスト以外のアクセスの集計 echo $result if [ $result -gt 0 ];then echo in result $result #ここに①の処理を入れたい fi done echo out result $result if [ $result -gt 0 ];then echo -e " $j アクセス件数:$result件" #②ここにサーバごとのアクセスの集計を出したいが変数$resultが引き継げない fi done

実行すると下のような感じで、ちゃんとresultは参照できています。

100 in result 100 100 in result 100 out result 100 host1 アクセス件数:100件

ご質問の趣旨を読み違えていたらすみません。

投稿2017/06/01 03:38

KojiDoi

総合スコア13671

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問