2023年3月
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
無料ブログはココログ

 

« 覚書:シェルでn日前・後の日付を変数に入れる | トップページ | 今週届いたもの、買ったもの »

2014年1月19日 (日)

シェルで年月日が入っているファイルが存在するか確認するスクリプト

保守のお仕事でログファイルの存在有無を確認する必要が出てきた。
ログファイル名にYYYYMMDD形式で年月日が入っていて、そのログファイルが特定の期間(1週間とか、2週間とか)に出力されているかをチェックする。

あ、OSは、Linuxで。
PerlとかWindowsに持ってきてからExcel VBAでやってみようと思ったのだけれど、結局、Linux上で元ネタとなるファイル一覧を取得しなければならないので、それだったらLinux上でシェルでやってしまった方が早いのではないかと思い、いままで避けていたシェルスクリプトの勉強がてら、作ってみました。

●使い方:
・検索したい ディレクトリ と ファイル名 の一覧を入れたリストファイル(ここではtest001.listとする)を用意する。

test002	testYYYYMMDDHH
test001	testYYYYMMDD
test003	testYYYYMMDDHH.log

・以下のようにコマンドを打つ。第一引数は検索リストファイル名、第二引数は開始年月日、第三引数は終了年月日。

./log_list.sh test001.list 20140119 20140121

・以下のように結果が出る。1行目は日付、2行目以降はディレクトリ+ファイル名とファイルがある場合”○”が出る。それぞれタブ文字で区切られる。

		20140119	20140120	20140121
test002/testYYYYMMDDHH	○		
test001/testYYYYMMDD	○	○	○
test003/testYYYYMMDDHH.log	○		

●プログラム

#!/bin/sh

usage() {
echo "log_list <log file list> <start date YYYYMMDD> <end date YYYYMMDD>"
}

check_date() {
result=`date -d $1 +%Y%m%d` > /dev/null 2>&1

if [ $1 = "$result" ]
then
return 0
else
return 1
fi
}

# CHECK ARGS
# 1st:loglist file. check exist
if [ ! \( -f $1 \) ]
then
usage
echo "Not Exist log file list name. $1"
exit 1
fi

# 2nd 3rd:date start, end
check_date $2
if [ $? -ne 0 ]
then
usage
echo "Arg no.2 invalid date. $2"
exit 1
fi

check_date $3
if [ $? -ne 0 ]
then
usage
echo "Arg no.3 invalid date. $3"
exit 1
fi

# delete log file
rm "log_list_$2_$3.dat" > /dev/null 2>&1

# header
chk_date=$2
while [ $chk_date -lt $3 ]
do
days="$days\t$chk_date"
chk_date=`date -d "$chk_date 1 day" +"%Y%m%d"`
done
echo "\t$days"

# read log file list
while  read log_dir log_filename
do
# date loop
chk_date=$2
while [ $chk_date -lt $3 ]
do
logfile=`echo $log_filename | sed -e "s/YYYYMMDD/$chk_date/"`
logfile=`echo $logfile | sed -e "s/HH/\*/"`
filename="$log_dir/$logfile"
#echo "$filename"
# check exist file
# if [ -f "$filename" ] <- can't use wildcard.
if ls $filename > /dev/null 2>&1
then
rslt="\\t○"
echo $logfile >> "log_list_$2_$3.dat"
else
rslt="\\t"
fi
results="$results$rslt"
chk_date=`date -d "$chk_date 1 day" +"%Y%m%d"`
done
echo "$log_dir/$log_filename$results"
results=""
done < $1

 

注:お試しプログラムですので、動作は保証しません。本プログラムを使用して被害・損害を受けた、または与えたとしても当方は一切責任を持ちませんのでご了承ください。また、質問 は一切受け付けませんのでご自分で勉強なさったら。まあ、オイラも勉強不足だし、直観とフィーリングでプログラムを作っているので、何が正しいかは己の心 に聞け!

USE AT YOUR OWN RISK

« 覚書:シェルでn日前・後の日付を変数に入れる | トップページ | 今週届いたもの、買ったもの »

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

« 覚書:シェルでn日前・後の日付を変数に入れる | トップページ | 今週届いたもの、買ったもの »