回答:
一般的なLinuxディストリビューションのそれ以降のバージョンでは、以下を使用できます。
date -d @1267619929
@
ためですか?私はそれをGNUのmanページでまったく見ていません。
brew install coreutils; gdate -d @1267619929
info 'Date input formats'
はdate
、関連するRobert Grudinの引用を含むのフォーマット情報ノードに直接アクセスし、次にフォーマット指定子のメニューを表示します。
date -r <number>
Mac OS Xで動作します。
このバージョンは、Chiborgの回答に似ていますが、外部tty
およびの必要がなくなりcat
ます。使用しますがdate
、簡単に使用できますgawk
。シバンを変更して、二重の角括弧を単一のものに置き換えることができますsh
。これもで実行されます。
#!/bin/bash
LANG=C
if [[ -z "$1" ]]
then
if [[ -p /dev/stdin ]] # input from a pipe
then
read -r p
else
echo "No timestamp given." >&2
exit
fi
else
p=$1
fi
date -d "@$p" +%c
gawk
は、出力がのみにリダイレクトされるか、出力がにリダイレクトされるdate
タイミングfor
ループよりも(非常に)15%高速です。gawk 'BEGIN { print strftime("%c", 1256571985); }'
date -d '@1256571985' +%c
/dev/null
たとえば、GNU日付を使用できます。
$ sec=1267619929
$ date -d "UTC 1970-01-01 $sec secs"
または
$ date -ud @1267619929
次の単純なawkスクリプトを使用できます。
#!/bin/gawk -f
{ print strftime("%c", $0); }
使用例:
$ echo '1098181096' | ./a.awk
Tue 19 Oct 2004 03:18:16 AM PDT
$
date -s @
は、機能せず、awk
引き続き機能します!stdinなしの例も役に立ちます。
Bash 4.2以降では、printf
の%(datefmt)T
形式を使用できます。
$ printf '%(%c)T\n' 1267619929
Wed 03 Mar 2010 01:38:49 PM CET
組み込みのシェルなので、これはすばらしいことです。datefmtの形式は、が受け入れる文字列ですstrftime(3)
(を参照man 3 strftime
)。ここに%c
あります:
%c
現在のロケールの優先日時表現。
引数を受け入れるスクリプトが必要で、引数が指定されていない場合にstdinを読み取る場合は、次のように進めることができます。
#!/bin/bash
if (($#)); then
printf '%(%c)T\n' "$@"
else
while read -r line; do
printf '%(%c)T\n' "$line"
done
fi
ログファイルを変換または監視するときに、これを使用します。
tail -f <log file> | gawk \
'{ printf strftime("%c", $1); for (i=2; i<NF; i++) printf $i " "; print $NF }'
awk '{ printf strftime("%c: ", $1); $1 = ""; print $0; }'
OSXまたはBSDに-r
は、UNIXタイムスタンプをとる同等のフラグがあります。次に、日付を4回実行する例を示します。最初の日付に1回、それが何であるかを示します。1つは、を使用したUNIXタイムスタンプへの変換用%s
で、最後に、を使用して-r
、%s
提供するものを文字列に変換します。
$ date; date +%s; date -r `date +%s`
Tue Oct 24 16:27:42 CDT 2017
1508880462
Tue Oct 24 16:27:42 CDT 2017
少なくとも、私のマシンでは動作しているようです。
$ uname -a
Darwin XXX-XXXXXXXX 16.7.0 Darwin Kernel Version 16.7.0: Thu Jun 15 17:36:27 PDT 2017; root:xnu-3789.70.16~2/RELEASE_X86_64 x86_64
これを自分で行うスクリプトを作成しました。
#!/bin/bash
LANG=C
if [ -z "$1" ]; then
if [ "$(tty)" = "not a tty" ]; then
p=`cat`;
else
echo "No timestamp given."
exit
fi
else
p=$1
fi
echo $p | gawk '{ print strftime("%c", $0); }'
この回答では、Dennis Williamsonの回答をコピーして少し変更し、多数のタイムスタンプの列をスクリプトにパイプするときに大幅な速度向上を可能にします。たとえば、私のマシンでxargs -n1を使用して元のスクリプトに1000のタイムスタンプをパイプすると、変更されたバージョンでは0.027秒でしたが、6.929秒かかりました。
#!/bin/bash
LANG=C
if [[ -z "$1" ]]
then
if [[ -p /dev/stdin ]] # input from a pipe
then
cat - | gawk '{ print strftime("%c", $1); }'
else
echo "No timestamp given." >&2
exit
fi
else
date -d @$1 +%c
fi
純粋なbashではありませんが、次のスクリプトは、文字列内の長さ13のタイムスタンプを、perlを使用してローカルタイムゾーンの同等の日付に変換します
#!/usr/bin/env bash
IT=$(cat /dev/stdin)
re='(.*)([0-9]{13})(.*)'
while [[ $IT =~ $re ]]; do
TIMESTAMP=${BASH_REMATCH[2]}
AS_DATE=$(echo "$TIMESTAMP" | perl -pe 's/([\d]{10})([\d]{3})/localtime $1/eg;')
IT="${IT/$TIMESTAMP/$AS_DATE}"
done
echo "$IT"
{"timestamp":"1573121629939","level":"DEBUG","thread":"http-nio-15372-exec-3","logger":"org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor"}
$ cat input | timestamp_to_date.sh
{"timestamp":"Thu Nov 7 06:13:49 2019","level":"DEBUG","thread":"http-nio-15372-exec-3","logger":"org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor"}
date -d @$(date -u +%s)