HP-UX General
1820087 メンバー
2828 オンライン
109608 解決策
新規ポスト

引数で1ヶ月前を指定したい

 
neky
アドバイザー

引数で1ヶ月前を指定したい

定期ログを取得するシェルを組んだのですが取得しなくてはならないのが1ヶ月前のログなのです。

ログのファイル名末尾(年月)を引数にして"date +%Y%m"でexpr使って1減らすという苦しいことを考えたのですが1月は0月になってしまうことに気づき、さらに苦し紛れで1月判別用のMONTH(月)加えてIF文でMONTH=0ならMONTH=12にしてDATEを去年の12月にしなさいというシェルを組みました。

<以下実行文>

DATE=$(expr $(date +%Y%m) - 1)

MONTH=$(expr $(date +%m) - 1)

if

then

YEAR=$(expr $(date +%Y) - 1)

MONTH=12

DATE=$(echo $YEAR$MONTH)

if

以下引数DATEでログ取得を実行・・・

サーバ時間の変更ができない為、不安なのが1月のdateの実行結果が-1したところで本当に上記の文で実行されるのかどうか・・・

「0」ではなくて「00」にしなくてはならない?

こうすればいい等、ご教授いただけましたら幸いです。
6件の返信6
watermelonyu
高貴なコントリビューター

引数で1ヶ月前を指定したい

こんにちは、

私も過去日付取得で悩んでいて、決定的な方法はまだ見つけていないのですが、

たとえばファイル名(末尾以外)が固定で、

末尾がなら

cd /foo/log

FILE=$(ls sample.log.* |tail -2 |head -1)

で、対象ファイル名が直接とれるんじゃないでしょうか?

あと、システムに変更をくわえても良いのならGNUのdateコマンドには過去日付取得オプションがありますよ。
neky
アドバイザー

引数で1ヶ月前を指定したい

取得ファイル名称がばらばら、固定なのはYYMMのみなんですよ。

とりあえず、取得は出来ているので1月のみ不安です。
hiroomi
頻繁なアドバイザー

引数で1ヶ月前を指定したい

スクリプトではファイル名の末尾のフォーマットがdate +%Y%mそのままだとすると6桁になりますが、2月から10月に実行するとexprの結果が01〜09にならずに1〜9になってDATEへの入力が5桁になってしまうと思います。

何度もdateを実行していますので可能性は低いですが、実行した時間によっては最初のdateの実行したタイミングと2度目以降のdateの実行で別の結果になってしまうことがあるかもしれません。

こんなのではいかがでしょうか。

DATE=`date +%Y%m`

MONTH=`expr $DATE % 100`

if ; then

DATE=`expr $DATE - 100 + 11`

else

DATE=`expr $DATE - 1`

fi

isao
頻繁なアドバイザー

引数で1ヶ月前を指定したい

月の出力を01、02...のように必ず前に0をつけたいということであれば、printf(1)を使う方法もあります。POSIX-SHのスクリプトなら以下のようにできます。

(( DATE = $( date +"%04Y%02m" ) ))

(( YEAR = DATE / 100 ))

(( MONTH = DATE % 100 - 1 ))

(( MONTH <= 0 )) && (( MONTH = 12 ))

FNAME=$( printf "log_%02d%02d" $YEAR $MONTH )

echo $FNAME

一行目で年と月を6桁で取り込み、

二行目で、DATEを100で割り年を取り出します。

三行目で、1を引いた月を取り出します。

四行目で、三行目の結果が0以下であれば月を12に設定しなおします。

五行目は、得た年と月をprintf(1)を用いフォーマット指定して出力しています。
neky
アドバイザー

引数で1ヶ月前を指定したい

皆様、いろいろなご回答ありがとうございます。

ただ、0月問題は解決できたのですが

年から更にマイナスすることを行わなくてはならないのですが

記述的には

(( MONTH <= 0 )) && (( YEAR = YEAR - 1 ))

これを一行付け加えればいいのでしょうか?
neky
アドバイザー

引数で1ヶ月前を指定したい

解決いたしました。

今回はisao様の表記を利用させていただき

年月を1ヶ月に戻すほうほうとして

(( MONTH <= 0 )) && (( MONTH = 12 )) && (( YEAR = YEAR - 1 ))

これでいけることを確認いたしました。

コマンドの詳細などもう少し勉強しなくてはなりませんね・・・orz

本当にありがとうございました。