投稿

ラベル(Linux)が付いた投稿を表示しています

Linuxコマンド: date で◯か月前 / ◯か月後を取得するときの注意

date コマンドは、日付を取得したり、整形して表示したり、◯日後や◯か月後、◯年前の日付を表示したりすることができます。 ◯か月前や◯か月後を使用する時が曲者で、月末に近い日に実行すると、思っていた動作をしてくれないことがあります。 $ date 2015年 9月 6日 日曜日 16:05:22 JST $ date -d "2015-08-31" 2015年 8月 31日 月曜日 00:00:00 JST $ date -d "2015-08-31 1 month" 2015年 10月 1日 木曜日 00:00:00 JST $ date -d "2015-01-31 1 month" 2015年 3月 3日 火曜日 00:00:00 JST 8月31日の1か月後が10月1日になったり、1月31日の1か月後が3月3日になったりします。月によって◯か月後の計算をきちんとしてくれるわけではないようです。 実施日の翌月末を取得するには、実施月の 1日に変換してから、2ヶ月後の1日前を指定することで取得できます。 $ date -d "`date '+%Y/%m/01' -d "\`date '+%Y/%m/01' \` 2 month"` 1 day ago" 2015年 10月 31日 土曜日 00:00:00 JST 指定した日付の翌月の月末を取得する場合は、以下のように書きます。 $ date -d "`date '+%Y/%m/01' -d "\`date '+%Y/%m/01' -d 2015/08/31\` 2 month"` 1 day ago" 2015年 8月 31日 月曜日 00:00:00 JST $ date -d "`date '+%Y/%m/01' -d "\`date '+%Y/%m/01' -d 2015/01/31\` 2 month"` 1 day ago" 2015年 2月 28日 土曜日 00:00:...

SASでリスト出力したテキストファイルに対して、grepコマンドを実行し「バイナリー・ファイル(標準入力)は一致しました」と出力される原因と解決方法

SASの話というよりは、Linux の grepコマンドの話。 SASでリスト出力したテキストファイル(.lst) に対して、grepコマンドを実行すると、「バイナリー・ファイル(標準入力)は一致しました」と出力されて、実行が終了されてしまう問題が発生しました。一部のリストファイルはきちんとgrepコマンドが実行されるのですが、理由が分からず右往左往してしまいました。 どうやら、grepコマンドは、バイナリファイルと思われるコードがあると、正常に動作してくれなくなるらしい(余計なことを…)。なので、明示的にテキストファイルと認識させるために、以下の3つのいずれかのオプションを付ける必要があります。 -a --text --binary-files=text これにより、テキストファイルと認識されるため、正常にgrepコマンドが実行されます。 そもそも、なぜリストファイルがバイナリファイルと認識されてしまったのか。これは、複数回リスト出力したときに発生します。 data TEST ; A = 1 ; run ; title "TEST 1" ; proc print data=TEST ; run ; title "TEST 2" ; proc print data=TEST ; run ; リストをテキスト出力したとき、人間の目には見えませんが、表と表の間に制御コード 0x0c(改ページ)が出力されています。この制御コードが、grepコマンドにリストファイルをバイナリファイルと思わせた原因でした。 参考サイト Linuxのgrep検索で「バイナリー・ファイル(標準入力)は一致しました」と表示される原因と解決方法 / r_nobuホームページ 2015/05/18 追記:ページ区切りに使われている改ページを変更する方法を発見しました! ページの区切り文字を 0x0c (改ページ) から、任意の文字に変更するオプション formdlim