[bash] Bash에서 타임 스탬프를 날짜로 변환하는 방법은 무엇입니까?

유닉스 타임 스탬프를 날짜로 변환하는 쉘 명령이나 스크립트가 필요합니다. 입력은 첫 번째 매개 변수 또는 stdin에서 가져올 수 있으며 다음 사용 패턴을 허용합니다.

ts2date 1267619929

echo 1267619929 | ts2date

두 명령 모두 “Wed Mar 3 13:38:49 2010″을 출력해야합니다.



답변

일반적인 Linux 배포판의 이후 버전에서는 다음을 사용할 수 있습니다.

date -d @1267619929


답변

date -r <number>

Mac OS X에서 작동합니다.


답변

이 버전은 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


답변

예를 들어 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
$


답변

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 }'