programing

bash 스크립트에 타임스탬프 변수 생성

subpage 2023. 4. 19. 23:02
반응형

bash 스크립트에 타임스탬프 변수 생성

셸 스크립트에 타임스탬프 변수를 생성하여 로깅을 좀 더 쉽게 하려고 합니다.할 때 하여 발행할 .echo $timestamp생각보다 어렵네요.을 사용하다

timestamp="(date +"%T")" " " 。(date +"%T")

timestamp="$(date +"%T")" 는 합니다.

내가 시도해 본 다른 것들은 단지 조금 변형된 것들이지만 더 잘 먹히지 않았다.내가 하려는 일을 어떻게 해낼지 아는 사람?

unix 타임스탬프를 취득하는 경우는, 다음을 사용할 필요가 있습니다.

timestamp=$(date +%s)

%T'이라고 하면 ''이라고 할 수 있어요.%H:%M:%S(http://www.cyberciti.biz/faq/linux-unix-formatting-dates-for-display/) 경유)

고정 변수가 정의된 시간이 아닌 현재 타임스탬프를 얻으려면 변수가 아닌 함수를 사용해야 합니다.

#!/bin/bash

# Define a timestamp function
timestamp() {
  date +"%T" # current time
}

# do something...
timestamp # print timestamp
# do something else...
timestamp # print another timestamp
# continue...

에서 들지 않는 %T에서 받아들이는 다른 시간 변환 할 수 date. GNU의 경우date, 이러한 지정자의 완전한 리스트는, 다음의 공식 메뉴얼로 입수할 수 있습니다.https://www.gnu.org/software/coreutils/manual/html_node/Time-conversion-specifiers.html#Time-conversion-specifiers

다음 표를 참조하여 다양한 형식의 타임스탬프를 생성할 수 있습니다.

형식/결과 명령어 산출량
YYY-MM-DD date -I $(date -I)
YYY-MM-DD_hh:mm:ss date +%F_%T $(date +%F_%T)
YYYMMDD_hhmmss date +%Y%m%d_%H%M%S $(date +%Y%m%d_%H%M%S)
YYYMMDD_hhmmss(UTC 버전) date --utc +%Y%m%d_%H%M%SZ $(date --utc +%Y%m%d_%H%M%SZ)
YYYMMDD_hhmmss(로컬 TZ 포함) date +%Y%m%d_%H%M%S%Z $(date +%Y%m%d_%H%M%S%Z)
YYYMMSSShhmmss date +%Y%m%d%H%M%S $(date +%Y%m%d%H%M%S)
YYYMMSShmmssnnnnnnnnnnnnnn date +%Y%m%d%H%M%S%N $(date +%Y%m%d%H%M%S%N)
YYMMDD_hhmmss date +%y%m%d_%H%M%S $(date +%y%m%d_%H%M%S)
UNIX epoch 이후의 초수 date +%s $(date +%s)
나노초만 date +%N $(date +%N)
UNIX Epoch 이후 나노초 date +%s%N $(date +%s%N)
ISO8601 UTC 타임스탬프 date --utc +%FT%TZ $(date --utc +%FT%TZ)
ISO8601 UTC 타임스탬프 + ms date --utc +%FT%T.%3NZ $(date --utc +%FT%T.%3NZ)
ISO8601 로컬 TZ 타임스탬프 date +%FT%T%Z $(date +%FT%T%Z)
YYY-MM-DD(단일) date +%F\(%a\) $(date +%F\(%a\))
YYY-MM-DD(긴 하루) date +%F\(%A\) $(date +%F\(%A\))
DATE=`date "+%Y%m%d"`

DATE_WITH_TIME=`date "+%Y%m%d-%H%M%S"` #add %3N as we want millisecond too

형식ISO 8601 식((( iso iso)2018-12-23T12:34:56는, 이 뛰어납니다)., 는 ", OS"를 할 수 .:을 추천합니다.따라서 대신 다음과 같은 것을 사용할 것을 권장합니다.

2018-12-23_12-34-56

다음 명령을 사용하여 이 형식의 타임스탬프를 가져올 수 있습니다.

TIMESTAMP=`date +%Y-%m-%d_%H-%M-%S`

이것은 많은 어플리케이션에서 사용하고 있는 형식입니다.또 다른 장점은 파일 이름이 이 문자로 시작하면 알파벳 순으로 정렬할 수 있으며 날짜별로 정렬됩니다.

유럽인 여러분, 이것을 사용해 보세요.

timestamp=$(date +%d-%m-%Y_%H-%M-%S)

는, 「15-02-198_19-21-58」의 형식을 지정합니다.

변수를 호출하면 다음과 같은 문자열 표현을 얻을 수 있습니다.

$timestamp

많은 답변이 있었지만 찾고 있던 것을 찾을 수 없었습니다.

date +"%s.%3N"

는 다음과 같은 것을 합니다.1606297368.210

명령어 대체 사용:

timestamp=$( date +%T )

ubuntu 14.04를 사용하고 있습니다.

시스템의 올바른 방법은date +%s.

date +%T~와 12:25:25.

사용할 수 있습니다.

timestamp=`date --rfc-3339=seconds`

이것은 다음과 같은 형식으로 제공됩니다.2014-02-01 15:12:35-05:00

뒷면 체크(`의 문자는, 그 에 있는 해, 그 의 문자는, 그 사이에 있는 문자를 평가해, 그 결과를 행에 포함합니다. date --help에는 다른 옵션이 있습니다.

bash date:

printf -v timestamp '%(%T)T'

%(...)T하고, 「유닉스」의 「유닉스」의 「유닉스」의 「유닉스」의 「유닉스」의 「유닉스」의 「유닉스」의 「유닉스」의 「유닉스」의 「유닉스」의 「유닉스」의 「유닉스」의 「유닉스」의 「유닛」에 형식을 합니다.strftime괄호 사이의 -style 형식.의 인수. " " "-1는 현재 시각에 대응하며 애매모호함이 발생하지 않는 경우는 생략할 수 있습니다.

timestamp=$(awk 'BEGIN {srand(); print srand()}')

값이 없는 srand는 대부분의 Awk 구현에서 현재 타임스탬프를 사용합니다.

요청하신 것보다 조금 더 많으므로 필요에 따라 커스터마이즈할 수 있습니다.

셸 스크립트에 타임스탬프 변수를 생성하려고 합니다...

이 스크립트를 사용하면 변수를 만들 수 있습니다.셸 콘텍스트를 변경할 때 재사용이 가능한지는 잘 모르겠습니다.그래도 될 거야

function timestamp {
    TEXT="Date:"
    DATE=`date +%Y-%m-%d`
    TIME=`date +%H:%M:%S`
    ZONE=`date +"%Z %z"`
    echo $TEXT $DATE $TIME $ZONE
}

function fulldate {
  timevariable=$(timestamp)
  echo $timevariable
}

echo "- Output 1:"
timestamp
echo "- Output 2:"
fulldate
echo "- Output 3:"
echo $timevariable

출력:

- Output 1:
Date: 2021-08-12 23:28:08 UTC +0000
- Output 2:
Date: 2021-08-12 23:28:08 UTC +0000
- Output 3:
Date: 2021-08-12 23:28:08 UTC +0000

GNU bash 버전 4.4.23 (1)-release(x86_64-pc-msys)에서 이 기능을 테스트했습니다.

퍼포먼스가 걱정된다면 @chepner의 대답은 확실한 승자입니다.

조금 더 복잡하지만 bash 내장만 사용하여 마이크로 또는 밀리초의 정밀도를 얻을 수도 있습니다.다음으로 밀리초를 포함한 현재의 타임스탬프를 송신하는 함수의 예를 나타냅니다.

timestamp() {
    IFS=. read S US <<<$EPOCHREALTIME # Read epoch seconds/microseconds
    MS=$((10#$US/1000)) # Convert to milliseconds (interpret in base-10, even with leading 0)
    printf '%(%F %T)T.%03i' $S $MS # Emit formatted timestamp
}

TS=$(timestamp) # Invoke function, assign to variable

에 주의:printf원하는 날짜/시간 형식을 사용하여 형식을 조정할 수 있습니다.

이 작업은 다음 명령어를 사용하여 수행할 수 있습니다.

:checkDate=$(date "+%s")

날짜의 경우 : 형형형날 for for for :checkDate=$(date "+%Y-%m-%d %H:%M:%S")

포크를 피하세요!!!

" " " " " 를 실행해야 .date★★★★★★★★★★★★★★★★!!

가능하면 bash의 빌트인을 사용합니다.

업데이트 2023

질문을 받았을 때 bash 버전은 bash-4.2였습니다.

이 버전에서는 현재 시간을 인쇄하기 위한 순수한 bash 방법은 다음과 같습니다.

printf '%(%T)T\n' -1

아니면

printf '%(%T)T\n' -1

따라서 각 행에 타임스탬프를 사용하여 짧은 함수로 로그인할 수 있습니다.

logLine() {
    printf '%(%T)T %s\n' -1 "$*"
}

그리고나서

$ logLine Hello world.
10:11:32 Hello world.

오늘은 bash-5.1.4를 사용합니다.

버전 5.0-alpha of bash, (2018-05-22) 이후:

b. EPOCHSEConds 변수가 있으며, 이는 Unix Epoch 이후 초 단위로 확장됩니다.

c. EPOCHREALTIME 변수가 있습니다.이는 Unix epoch 이후 초 단위로 마이크로초 단위로 확장됩니다.

따라서 마이크로초의 세분화를 사용하는 경우 다음과 같은 기능을 사용할 수 있습니다.

logLine() {
    local now=$EPOCHREALTIME
    printf '%(%T)T.%s %s\n' ${now%.*} ${now#*.} "$*"
}

그리고나서

$ logLine Hello world.
10:15:56.862732 Hello world.

중요: EPOCHREALTIME과 EPOCHSECONDS를 혼재시키지 마세요!!!

GNU bash, 버전 4.4.20 (1)-release(x86_64-pc-linux-gnu)의 타임스탬프 포맷 트릭

 echo "$(date +%Y-%m-%d_%H:%M:%S.%6N) Info >>> enter main"

출력:

 2023-01-08_23:08:48.013592 Info >>> enter main

'_'를 공백으로 바꾸려면 다음을 수행합니다('\'에 오류 메시지가 표시됨).

 echo "$(date +%Y-%m-%d\ %H:%M:%S.%6N) Info >>> enter main"
 echo "$(date +%Y-%m-%d\ %T.%6N) Info >>> enter main"

출력:

 2023-01-08 23:10:40.692674 Info >>> enter main

다음은 로컬 날짜와 시간을 제공합니다. 단, 인터넷 접속이 필요합니다.로그에 기록되는 항목에 따라서는 접속 상태를 감시하고 기록하는 것이 유리할 수 있습니다.

curl -i --silent https://google.com/ 2>&1 | grep date

date: Fri, 03 Jun 2022 17:39:19 GMT

언급URL : https://stackoverflow.com/questions/17066250/create-timestamp-variable-in-bash-script

반응형