awkスクリプトから「日付」の出力に現在時刻を取得する

awkスクリプトから「日付」の出力に現在時刻を取得する

awk私がコマンドを使用するスクリプト

system(date)

ファイルの現在の日付を印刷しますが、このコマンドを実行すると、次の行も暗黙的に追加されます。awk次の印刷内容が同じ行になるように、新しい行を追加せずに現在の日付を印刷する方法はありますか?

答え1

このdateコマンドは、出力の末尾に改行文字を追加します。出力をawkとして読み、改行を追加せずに印刷できます。

"date" | getline date; printf "%s", date

スクリプトが長時間実行されない限り、スクリプトが開始された日付を取得することもできます。

awk -v date="$(date)" '
    … printf "%s", date …
'

答え2

GNUawk@トーマスディキmawk実装には、awk時間と日付の機能に関するいくつかの拡張があります。これにより、次のことができます。

strftime("%+", systime())

dateユーティリティで生成されたのと同じ形式で文字列表現を取得します。

または、少し異なる形式ですが、移植性が高い場合(BSDではないシステムの場合)

strftime("%c", systime())

テスト:

$ date
Mon Jan 28 11:22:22 CET 2019
$ gawk 'BEGIN { print strftime("%+", systime()) }'
Mon Jan 28 11:22:27 CET 2019
$ mawk 'BEGIN { print strftime("%+", systime()) }'
Mon Jan 28 11:22:33 CET 2019

システムがその形式をサポートしていない場合%+(なしglibc2)、%cそれに非常に近い形式を生成できます。正確な形式は、strftime()Cライブラリの実装と現在の日付/時刻関連のロケールによって異なります。C/ロケールでは上記とPOSIX同じ出力が得られますが、タイムゾーンの略語はありません。

BSDawk実装には基本的にこれらの機能がない可能性があります。

また見なさい:

  • システムのawkおよび(時間/日付スタンプ形式のための)マニュアル 。strftime

関連情報