日時範囲指定ログ抽出awkコマンド用ファイル作成シェルスクリプト その2

estis2012/02/09 (木) 03:22 に投稿

日付確認をきっちりするようにした。ただし作業年と同年の日付が対象(日付確認については2月以外で問題は発生しないが)。

とりあえず対象はメールログ(ログの第2フィールドが日付、第3フィールドが:区切りで時刻[hh:mm:ss]となっているもの)。
このバージョンでは、同月内のみ対応。

#!/bin/bash

thisVer (){
        if [ $fromMonth -ne $toMonth ];then
                echo " このバージョンでは、同月内のみの対応です。ごめんなさい。"
                exit 1
        fi
}

iInput (){
        if [ $i -ne 0 ]; then
                echo "入力した値が間違っています。再入力してください。"
        fi
}

check_M (){
        i=0
        checkMonth=-1
        until [ $checkMonth -ge 1 -a $checkMonth -le 12 ]
        do
                iInput
                echo -n $1
                read checkMonth
                i=1
        done
        return $checkMonth
}

check_D (){
        check_D_Re (){
                iInput
                echo -n $D_string
                read checkDay
                i=1
                date --date "$D_month/$checkDay" >/dev/null 2>&1
        }
        i=0
        D_month=$1
        D_string=$2
        checkDay=-1
        until [ $? -eq 0 -a $i -ne 0 ]
        do
                check_D_Re
        done
        return $checkDay
}

check_H (){
        i=0
        checkHour=-1
        until [ $checkHour -ge 0 -a $checkHour -le 23 ]
        do
                iInput
                echo -n $1
                read checkHour
                i=1
        done
        return $checkHour
}

check_T (){
        i=0
        checkTime=-1
        until [ $checkTime -ge 0 -a $checkTime -le 59 ]
        do
                iInput
                echo -n $1
                read checkTime
                i=1
        done
        return $checkTime
}

echo "日時範囲を指定してください。"
check_M "開始月:"
fromMonth=$?
check_D $fromMonth "開始日:"
fromDay=$?
check_H "開始時:"
fromHour=$?
check_T "開始分:"
fromMin=$?
check_T "開始秒:"
fromSec=$?
check_M $toMonth "終了月:"
toMonth=$?

thisVer

check_D $toMonth "終了日:"
toDay=$?
check_H "終了時:"
toHour=$?
check_T "終了分:"
toMin=$?
check_T "終了秒:"
toSec=$?

FROM=$(date --date "$fromMonth/$fromDay $fromHour:$fromMin:$fromSec" +%s)
TO=$(date --date "$toMonth/$toDay $toHour:$toMin:$toSec" +%s)

if [ $TO -lt $FROM ]; then
        echo "エラー! 終了日時が開始日時より前になっています。"
        exit 1
fi

if [ $fromDay -eq $toDay ]; then
        if [ $fromHour -eq $toHour ]; then
                if [ $fromMin -eq $toMin ]; then
                        if [ $fromSec -eq $toSec ]; then
                                echo "{split(\$3, a, \":\");if(\$2==$fromDay&&a[1]==$fromHour&&a[2]==$fromMin&&a[3]==$fromSec)print}"
                        else
                                echo "{split(\$3, a, \":\");if(\$2==$fromDay&&a[1]==$fromHour&&a[2]==$fromMin&&a[3]>=$fromSec&&a[3]=$fromSec)||(a[2]>$fromMin&&a[2]=$fromSec)||(a[1]==$fromHour&&a[2]>$fromMin)||(a[1]>$fromHour&&a[1]=$fromSec)||(a[1]==$fromHour&&a[2]>$fromMin)||(a[1]>$fromHour)))||(\$2>$fromDay&&\$2