awk / grepを使用して、最初の列にUnixタイムスタンプを含むテキストファイルを表示したいと思います。見たときに人が読める時間にどのように変換しますか?
答え1
行がUnixタイムスタンプで始まる場合は、次のことを行う必要があります。
perl -pe 's/^(\d+)/localtime $1/e' inputfilename
perl -p
各入力行に対して実行される渡された式に対してループを呼び出し、-e
ループの末尾にバッファを印刷します。
この式は、substitionコマンドを使用してs///
各行の先頭にある一連の数字を一致してキャプチャし、それをUnixタイムスタンプとして解釈されるその数字の現地時間表現に置き換えます。/e
代替パターンが式として評価されることを示します。
答え2
AWKが次の場合愚かな、あなたはそれを使用することができますstrftime
:
gawk '{ print strftime("%c", $1) }'
最初の列のタイムスタンプを現在のロケールのデフォルトの日付/時刻表現に変換します。
これを使用して、コンテンツを表示する前に変換できます。
gawk '{ print gensub($1, strftime("%c", $1), 1) }' inputfile
答え3
「日付」を使用してください
これには、Perl、awk、php、または長い算術式は必要ありません。 gnu "date"を使ってこれを行うことができます。これはこの種の作業に本当に便利です。 「date」の他のバージョンでは YMMV です。
$ date -d '1/1/1970 GMT 1571889039 seconds'
Wed Oct 23 20:50:39 PDT 2019
ここで何が起こるのかは、時間を指定して調整することです。時間はUNIX時代の1970年1月1日深夜(GMT)です。 (真夜中は明示的には与えられず、1日の時間を省略するたびに暗黙的に使用されます。)
時間に1571889039秒の調整値を追加します。明らかにタイムスタンプを使用してください。このマニュアルでは、この機能を説明するために「相対的」という単語を使用しています。
最新バージョンのGNU Dateについては、マンページの例としてのみ文書化されたよりきれいなバージョンがあります。
$ date -d @2147483647
Mon Jan 18 19:14:07 PST 2038
日付を頻繁に操作する必要がある場合は、日付コマンドを知ってください。それは単なる時計ではありません。これはシェルの日付/時刻ライブラリです。
答え4
ポータブルバージョンでは、最悪のシナリオを直接計算できます。 Unixタイムスタンプは次のように定義されています。POSIX XBDエポック後4.16秒:
tm_sec + tm_min*60 + tm_hour*3600 + tm_yday*86400 + (tm_year-70)*31536000 + ((tm_year-69)/4)*86400 - ((tm_year-1)/100)*86400 + ((tm_year+299)/400)*86400
これは目的のマッピングの逆なので、これを元に戻すには少し作業が必要です。これにより「POSIX UTC」が分解されますが、現在のタイムゾーンでフォーマットする方法が必要になる場合があります。移植性がdate -d
ないようで、これを行うための良い方法があるかどうかはわかりません。
*わかりました、それは切除された表現かもしれません。