답변:
일반적인 Linux 배포판의 이후 버전에서는 다음을 사용할 수 있습니다.
date -d @1267619929
@
? 나는 GNU man 페이지에서 전혀 보지 못했습니다.
brew install coreutils; gdate -d @1267619929
info 'Date input formats'
date
적절한 Robert Grudin 따옴표와 서식 지정자 메뉴를 사용하여의 서식 정보 노드로 바로 이동 합니다.
이 버전은 chiborg의 답변 과 비슷 하지만 외부 tty
및 의 필요성을 제거합니다 cat
. 사용 date
하지만 쉽게 사용할 수 있습니다 gawk
. shebang을 변경하고 이중 대괄호를 단일 대괄호로 바꿀 수 있습니다 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
보다 15 % 빠릅니다 . date
for
gawk 'BEGIN { print strftime("%c", 1256571985); }'
date -d '@1256571985' +%c
/dev/null
이 간단한 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
에는 유닉스 타임 스탬프가 필요한 동등한 플래그가 있습니다. 다음은 날짜를 네 번 실행하는 예입니다. 첫 번째 날짜에 한 번, 현재 날짜를 표시합니다. 를 사용하여 유닉스 타임 스탬프로 변환하기위한 것이고 %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)