nawk で時刻取得

awk_256.jpg perl 2日前の日付を取得するに書かれてあるように gawk, xgawk 以外で時間の計算を行うのは困難です。 AWK を 256 倍使うための本の中に書かれていますが、srand() を用いた方法くらいしかありません。 この書籍の中のスクリプトはAWKを256倍使うための本から入手することができますが、少し Unix 系 OS に合わせて書き直してみます。(といっても環境変数から取得するようにしただけですが・・・)

#! /usr/bin/gawk -f
# time.awk

BEGIN {
    print get_time();
}

# get_time() - get time and date
function get_time() {

    # set Time Zone
    split(ENVIRON["TZ"], arr_tz, /[-+]/);
    time_zone = arr_tz[2] * 3600;

    # set short name of week
    split("Sun Mon Tue Wed Thu Fri Sat", week_name, " ");
    # set short name of month
    split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec", month_name, " ");
    # set length of month
    split("31 28 31 30 31 30 31 31 30 31 30 31 31 29 31 30 31 30 31 31 30 31 30 31",
          month_length, " ");

    # get elapsed seconds from epoc time
    srand();
    system_time = srand() + time_zone;

    second   = system_time % 60;
    minute   = int(system_time / 60) % 60;
    hour     = int(system_time / 3600) % 24;
    day      = int(system_time / (3600 * 24));
    week_num = (day + 4) % 7 + 1;

    year     = 1970;                    # initial year

    for (++day;;) {

        # check leap year
        if ((year % 4) == 0 && (year % 100) != 0 || (year % 400) == 0) {
            leap = 12;
        } else {
            leap = 0;
        }

        # set days of the year
        if (leap != 0) {
            year_days = 366;
        } else {
            year_days = 365;
        }

        if (day < year_days) {
            break;
        }

        ++year;
        day -= year_days;
    }

    for (month = 1; month_length[month + leap] + 0 <= day + 0; ++month) {
        day -= month_length[month + leap];
    }

    return sprintf("%.3s %.3s%3d %02d:%02d:%02d JST %d",
                    week_name[week_num], month_name[month], day,
                    hour, minute, second, year);
}

非常に長くなることが分かります。

$ nawk -f time.awk
Mon Aug 18 00:47:16 JST 2008
$ LC_ALL=C date
Mon Aug 18 00:47:32 JST 2008

今となっては古くさい計算かもしれませんが、エポック時間からの計算方法にはいろいろなノウハウが含まれていますので、一度は目を通しておくと何かの役に立つかもしれません。

さて、2 日前の計算をする場合でも上の system_time から 172800 (秒) を引けば良いことも分かると思います。

上記スクリプトはAWKを256倍使うための本からの引用であるため、問題がある場合には本コンテンツは削除します。

tag_nawk.pngtag_nawk.pngtag_nawk.pngtag_nawk.png