ウェブサイト検索

LinuxでのBashスクリプトで日付コマンドを使用する


私が Bash スクリプトを書き始めたとき、ほとんどのスクリプトでよく扱う操作の一つが日付と時刻の処理であることに気付きました。私は、日付でファイルやディレクトリに名前を付ける、APIの結果を取得する、エポック値をアプリケーションに適した日付/時刻に変換する、CSVファイルの日付列を操作するなど、多くの操作を行ってきました。もし Bash スクリプトの初心者であれば、この記事は Bashスクリプトでのdateコマンドの使い方、シェルスクリプトでdateコマンドを使用して日付と時刻を操作する方法、およびそれらを操作して Linux でさまざまな操作を行う方法の理解に役立ちます。

システムの日付と時刻がどのように設定されるかについて、基本的な理解を持っているべきです。この部分は、あなたの仕事では主にサーバー管理者によって処理されます。

しかし、もしあなたが個人ユーザーで、自分のパソコンでLinuxを使用している場合、日付と時間がどのように設定されるか、それらを同期する方法、およびそれを変更する方法を理解しているべきです。

Linuxでは時間を同期させるために2つの時計が使われています。

  • リアルタイムクロック - これはシステムのマザーボードに統合された時計で、マシンの電源を切っても動作します。
  • システムクロック - これはLinuxカーネルによって管理され、システム起動中にカーネルはリアルタイムクロックから初期時刻を取得します。

日付と時間を設定するプロセスを進めるつもりはありません。それは別の議論すべき話題です。では、LinuxのBashスクリプトでdateコマンドを使う方法に関するこの記事の核心部分を見ていきましょう。

ヘルプを得る

まず、次のコマンドを実行して date コマンドのバイナリの場所を確認できます。

$ which date
/usr/bin/date

dateコマンドはシェルの組み込みではなく、外部プログラムです。その情報はtypeコマンドを実行することで得ることができます。

$ type -a date
date is /usr/bin/date
date is /bin/date

作業するオプションはたくさんあり、すべてを覚えることはできません。ここで、ヘルプやマニュアルページが役に立ちます。

次のコマンドを実行して、date コマンドのマニュアルページにアクセスします。

$ man date

次のコマンドを実行して、ヘルプメッセージにアクセスしてください。

$ date --help

現在の日付と時刻を印刷する

ターミナルを起動して、単に date コマンドを実行します。現在の日付と時刻、およびタイムゾーンが取得できます。私の場合、OSのインストール時にタイムゾーンを IST に設定しました。

$ date
Sunday 13 February 2022 11:27:17 AM IST

UTC タイムゾーンの日付と時刻は、-u フラグを使用することで取得することもできます。

$ date -u
Sunday 13 February 2022 05:57:36 AM UTC

タイムゾーン変換

dateコマンドの出力を異なるタイムゾーンで取得するには、環境変数TZを設定します。以下の例では、TZをモスクワとシンガポールのタイムゾーンに設定しました。

$ Z="Europe/Moscow" date
Sunday 13 February 2022 08:59:03 AM MSK
$ TZ="Asia/Singapore" date
Sunday 13 February 2022 01:59:37 PM +08

「timedatectl」コマンドを実行することで、タイムゾーンの一覧を取得できます。

$ timedatectl list-timezones
$ timedatectl list-timezones | grep -i singapore
Asia/Singapore
Singapore
$ timedatectl list-timezones | grep -i moscow
Europe/Moscow

ファイルの最終変更時刻

通常、ファイルの変更時刻を確認するには stat コマンドを使用します。同じことは -r フラグを使用して date コマンドでも確認できます。

$ stat ~/.bashrc
  File: /home/karthick/.bashrc
  Size: 4342          Blocks: 16         IO Block: 4096   regular file
Device: 806h/2054d    Inode: 27787278    Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/karthick)   Gid: ( 1000/karthick)
Access: 2022-02-13 09:06:45.713721080 +0530
Modify: 2022-02-11 20:18:52.485178931 +0530
Change: 2022-02-11 20:18:52.485178931 +0530
 Birth: -
$ date -r ~/.bashrc
Friday 11 February 2022 08:18:52 PM IST

stat コマンドの出力形式は date コマンドと異なることがわかりますが、どちらも同じ目的を持っています。

さまざまな書式設定オプション

date コマンドはフォーマットオプションをサポートしており、これらのオプションを使用することで、date コマンドの出力を希望する任意の形式にフォーマットすることができるか、出力から特定の値だけを取得することもできます。

dateコマンドのマニュアルページを開き、下の画像に示されているセクションを探してください。

日付コマンドの書式オプション

フォーマットのオプションはたくさんありますが、すべてが役立つわけではありません。いくつかの重要なフォーマットオプションを見て、それがどのように機能するかを理解します。

デフォルトでは、date コマンドは日付と時刻を表示します。日付だけ、あるいは時刻だけを表示したい場合はどうすればよいでしょうか?

$ date
Sunday 13 February 2022 11:27:17 AM IST

日付だけを取得するには、%F フラグまたは %D フラグを使用できます。

$ date +%F
2021-11-16
$ date +%D
02/13/22

フォーマッターフラグを使用する場合は、上の例で私が行ったように、+ 記号を前につける必要があります。

  • %F フラグの出力は YYYY-MM-DD 形式になります。
  • %D フラグの出力は MM/DD/YY 形式になります。

日、月、年をそれぞれ個別に取得して、新しい形式の出力を作成することができます。

$ date +%Y
2022
$ date +%m
02
$ date +%d
13

自分のフォーマットされた出力を作成するには、以下に示すすべてのフラグを組み合わせるだけです。

$ date +%Y_%m_%d
2022_02_13

日付と同様に、%r(12時間形式)や%T(24時間形式)フラグを使用して時間だけを取得することもできます。

$ date +%r # 12 hour format
11:24:12 PM IST
$ date +%T # 24 hour format
23:24:11

時間、分、秒をそれぞれ取得して、自分のフォーマットされた出力を作成できます。

$ date +%H
12
$ date +%M
24
$ date +%S
03

上記のすべてのフラグを組み合わせて、カスタム出力を作成してください。

$ date +%H_%M_%S
12_26_53

では、これらのカスタム書式設定オプションはどこで役立つのでしょうか?私の場合、スクリプトの一部としてファイルを作成する際には、今日の日付で名前を付けます。ですので、必要なときにそれを確認するのに役立ちます。

これまで、日付と時刻を個別に扱う方法を見てきました。場合によっては、日付と時刻の両方を表示したいことがあります。その場合、以下のように日付と時刻を組み合わせることもできますし、自分でフォーマットされた出力を作成することもできます。

$ date "+%F %r"
2021-11-16 11:29:06 PM IST

特定の日にのみスクリプトを実行する

場合によっては、スクリプトを週の特定の曜日だけで実行したいことがあります。たとえば、スクリプトを金曜日だけ実行したい場合、%A(Friday)または%a(Fri)フラグを使用して、それに応じたロジックを書くことができます。

if [[ $(date +%A) = Friday ]]
then
  echo "Running the code"
else
  echo "Today is not Friday, Exiting the script"
fi
OUTPUT:
Today is not Friday, Exiting the script

さらに多くのフォーマットオプションが利用可能です。マニュアルページを参照し、それらをすべて確認してください。

出力を変数に保存する

スクリプトを書くときには、date コマンドの出力を変数に保存し、その変数をスクリプト内で使用することが最良の方法です。そのような例のひとつとして、日付と時刻を使ってファイル名を作成する場合があります。

以下の例を見てください。ここでは今日の日付が変数TDYに格納され、同じ変数を使用してファイル名"disk_usage_${TDY}.txt"が作成されます。このファイルには"df -h"コマンドの出力が保存されます。

$ TDY=$(date +%F)
$ df -h > ~/disk_usage_${TDY}.txt
$ ls -l *.txt
-rw-rw-r-- 1 karthick karthick 474 Feb 13 23:40 disk_usage_2022-02-13.txt
$ cat disk_usage_2022-02-13.txt 
Filesystem      Size  Used Avail Use% Mounted on
tmpfs           1.6G  154M  1.5G  10% /run
/dev/sda7        93G   27G   61G  31% /
tmpfs           7.8G   82M  7.7G   2% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           4.0M     0  4.0M   0% /sys/fs/cgroup
/dev/sda9       261G  130G  118G  53% /nextdrive
/dev/sda6       348G  110G  221G  34% /home
/dev/sda5       2.0G  234M  1.8G  12% /boot/efi
tmpfs           1.6G  180K  1.6G   1% /run/user/1000

-d または --date フラグを使用する

これは私がdateコマンドで最も気に入っている重要な機能です。文字列を-dまたは--dateフラグの引数として渡すと、デフォルト形式で出力が得られます。

以下の例を見てください。文字列引数として "today"、"yesterday"、"tomorrow"、"last Thursday"、"Today (+,-) 20 years" を --date フラグに渡しました。date コマンドはこれらの文字列を解釈し、出力をデフォルトの形式に変換します。

$ date --date "Today"
Sunday 13 February 2022 01:01:26 PM IST
$ date --date "now"
Sunday 13 February 2022 01:01:34 PM IST
$ date --date "yesterday"
Saturday 12 February 2022 01:01:39 PM IST
$ date --date "Tomorrow"
Monday 14 February 2022 01:01:45 PM IST
$ date --date "Last Thursday"
Thursday 10 February 2022 12:00:00 AM IST
$ date --date "Today - 20 years"
Wednesday 13 February 2002 01:01:56 PM IST
$ date --date "Today + 20 years"
Thursday 13 February 2042 01:02:01 PM IST

上の例で示したもの以外の、より多くの関連する文字列引数を渡すことができます。

エポック時間

エポック時間は、-d または --date フラグを使用して現在の日付と時刻の形式に変換できます。%s フラグの出力はエポック形式になります。

$ date +%s
1644737777

標準の人間が読める形式に変換するには、以下のようにエポック時間の前に @ を追加します。

$ date --date @1644737777
Sunday 13 February 2022 01:06:17 PM IST

上記のすべての例で、デフォルト出力が表示されることがわかります。フォーマッターを -d または --date フラグと組み合わせて、カスタム出力を得ることができます。

$ date --date "Today + 20 years" +%Y
2042
$ date --date "Today + 21 years" +%s
2275890194
$ date --date @2275890194 +%Y
2042

結論

この記事では、例を使ってBashスクリプトでのdateコマンドの使い方について説明しました。この時点で、スクリプトでdateコマンドを使うことに慣れているはずです。利用できるフォーマットオプションはたくさんありますので、試して慣れてください。

この記事に関するフィードバックや提案がありましたら、下のコメント欄でお知らせください。

Bashスクリプトガイド:

  • LinuxおよびUnixでBashスクリプトをデバッグする方法
  • Bashスクリプト – getoptsを使ってBashスクリプトで引数を解析する
  • LinuxおよびUnixでZenityを使ってBashスクリプトにGUIダイアログボックスを作成する方法
  • Bashスクリプト – Case文
  • Bashスクリプト – 条件文
  • バッシュスクリプト – 文字列操作
  • Bashスクリプト – printfコマンドの例を用いた説明
  • バッシュスクリプト – 添字付き配列を例で解説
  • Bashスクリプト – 連想配列を例で解説
  • Bashスクリプト – Forループの例を使った解説
  • Bashスクリプト – WhileループとUntilループの例付き解説
  • 事例で解説するBashのリダイレクション
  • Bashスクリプト – 変数の説明と例
  • Bashスクリプト – 関数の説明と例
  • LinuxにおけるBashのechoコマンドの説明と例
  • 初心者のためのBashヒアドキュメントチュートリアル