타임스탬프를 Bash 날짜로 변환하는 방법
Unix 타임스탬프를 날짜로 변환하는 셸 명령 또는 스크립트가 필요합니다.입력은 첫 번째 파라미터 또는 stdin에서 얻을 수 있으며 다음과 같은 사용 패턴을 허용합니다.
ts2date 1267619929
그리고.
echo 1267619929 | ts2date
두 명령 모두 "2010년 3월 3일(수) 13:38:49"를 출력해야 합니다.
Linux와 같이 GNU Coreutils > = 5.3.0이 설치된 시스템에서는 다음을 사용할 수 있습니다.
date -d @1267619929
date -r <number>
Mac OS X에서는 동작합니다.
이 버전은 chiborg의 sanswer와 비슷하지만 외부 기능이 필요 없습니다.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
예를 들어 GNU 날짜를 사용할 수 있습니다.
$ sec=1267619929
$ date -d "UTC 1970-01-01 $sec secs"
또는
$ date -ud @1267619929
타임스탬프에서 이렇게 포맷된 날짜를 얻을 수 있습니다.
date +'%Y-%m-%d %H:%M:%S' -d "@timestamp"
크로스 플랫폼 원라이너를 사용하고 있습니다.
date -d @1267619929 2>/dev/null || date -r 1267619929
MacOS와 최신 버전의 Linux 배포판 모두에서 작동합니다.
다음의 간단한 awk 스크립트를 사용할 수 있습니다.
#!/bin/gawk -f
{ print strftime("%c", $0); }
사용 예:
$ echo '1098181096' | ./a.awk
Tue 19 Oct 2004 03:18:16 AM PDT
$
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 }'
OSX 또는 BSD에는 동등한 기능이 있습니다.-r
unix 타임스탬프를 취득하는 플래그입니다.다음은 날짜를 4회 실행하는 예입니다.첫 번째 날짜에 대해 1회, 다음에 나타내는 UNIX 타임스탬프로 변환하기 위한 1회입니다.%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.027s에 비해 6.929s가 소요됩니다.
#!/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
몇 가지 예:
달러 날짜2016년 3월 22일 (화) 16:47:06 CST $ date - d "3월 22일 (화) 16:47:06 CST 2016" "+%s"1458636426 $ 날짜 + %s1458636453 $ date - d @ param86364262016년 3월 22일 (화) 16:47:06 CST $ date --date='@syslog8636426'2016년 3월 22일 (화) 16:47:06 CST
순수 bash는 아니지만 다음 스크립트는 perl을 사용하여 문자열 길이 13의 타임스탬프를 로컬 시간대 내의 동등한 날짜로 변환합니다.
timestamp_to_date.쉿
#!/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"}
이해가 가기 위해 내 bash 이력에서 타임스탬프를 인라인으로 변환해야 했습니다.
셸 명령어의 출력에 의한 서브스트링을 sed, awk 등으로 대체하려면 어떻게 해야 하는가라는 답변에서 나온 다음 내용이 다른 독자들에게도 흥미로울 수 있습니다.원래 sed 인라인 코드에 대한 칭찬은 @Gabriel로 갑니다.
cat ~/.bash_history | sed "s/^#\([0-9]\+\)$/echo -n '#'; date -u --d @\1 '\+\%Y-\%m-\%d \%T'/e" | less
여러 타임스탬프를 동시에 포맷하는 경우 텍스트스트림에 타임스탬프를 포맷하는 datefmt라는 C 유틸리티가 있습니다.
unix 타임스탬프를 포함한 로그가 있다고 합시다.
$ cat logs.txt
EVENTS 1638499687 blahblah log1
EVENTS 1638499717 blahblah log2
이 로그를 datefmt로 파이프하여 이러한 타임스탬프를 사람이 읽을 수 있는 날짜로 변환할 수 있습니다.
$ <logs.txt datefmt
EVENTS 2021-12-02 18:48 blahblah log1
EVENTS 2021-12-02 18:48 blahblah log2
물론 포맷을 커스터마이즈할 수도 있습니다.
$ <logs.txt datefmt "DATE:'%m-%d %R'"
EVENTS DATE:'12-02 18:48' blahblah log1
EVENTS DATE:'12-02 18:48' blahblah log2
곧만, 하여 NixOS로 빌드할 .make
나는 특수한 경우에 대한 이전 솔루션이 마음에 든다.printf '%(%c)T\n' $timestamp
4.2인 ), (Bash > = 4).2개입니다.date -d @$timestamp
의 ), (GNU Coreutils > = 5.3.0 의 경우),date -r $timestamp
는) 이 좋은 에 (BSD/MacOS)를 했습니다.jq
수 있는 곳은 든지 있다: ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」
jq 'todate' <<< $timestamp
원하는 효과를 얻기 위해 기능에서 사용할 수 있습니다.
ts2date() { [[ -n "$1" ]] && { jq 'todate' <<< $1 ; true;} || jq 'todate' ; }
PHP의 경우
$unix_time = 1256571985;
echo date("Y-m-d H:i:s",$unix_time)
언급URL : https://stackoverflow.com/questions/2371248/how-to-convert-timestamps-to-dates-in-bash
'programing' 카테고리의 다른 글
특정 날짜 이후 행 나열 (0) | 2023.04.15 |
---|---|
Cygwin과 MinGW의 차이점은 무엇입니까? (0) | 2023.04.15 |
Excel에서 SQL "IN" 함수 사용 (0) | 2023.04.15 |
여러 바인딩을 사용하여 C# WPF가 네이블입니까? (0) | 2023.04.15 |
UserControl 포커스 직사각형 삭제 (0) | 2023.04.15 |