BSD에서 자연어 날짜를 구문 분석합니다.

BSD에서 자연어 날짜를 구문 분석합니다.

저는 GNU date 명령을 사용하여 임의의 자연어 날짜를 구문 분석합니다. 예를 들어 특정 시대의 타임스탬프가 지난 주의 것인지 감지하려면 다음을 수행합니다.

if [ "$timestamp" -lt "$(date +"%s" -d "last sunday")" ]; then ...

이제 스크립트를 FreeBSD로 포팅하려고 할 때 어떻게 동일한 기능을 얻을 수 있습니까? man date내가 뭔가 분명한 것을 놓치고 있지 않는 한 어떤 약속도 보여주지 않습니다.

답변1

많이있다FreeBSD의 명령은 GNU와 동일한 API를 사용하여 date사용자의 자연어 날짜를 입력합니다.. 방금 해당 날짜를 Unix 시대 시간으로 변환하도록 속일 수 있는 방법을 발견했습니다.

/usr/sbin/fifolog_reader -B 'last sunday' /dev/null 2>&1 |
  sed 's/^From[[:blank:]]*\([0-9]*\).*/\1/p'

(적어도 제가 시도한 FreeBSD 9.1-RELEASE-p2에서는 UTC 시간대에 있고 인식하는 날짜 사양이 GNU에서 인식하는 날짜 사양과 반드시 ​​동일하지는 않을 경우에만 안정적으로 작동하는 것 같습니다. 날짜).

일부 쉘에는 이 기능이 내장되어 있습니다.

ksh93:

if (( timestamp < $(printf '%(%s)T' 'last sunday') )); then

zsh:

autoload calendar_scandate
calendar_scandate 'last sun'
if (( timestamp < REPLY)); then...

또는 설치된 경우 perl다음을 사용할 수 있습니다 .Date::Manip

last_sun=$(perl -MDate::Manip -e 'print UnixDate("last sunday","%s")')
if [ "$timestamp" -lt "$last_sun" ]; then...

또는:

if perl -MDate::Manip -e 'exit 1 unless $ARGV[0] < UnixDate("last sunday","%s")
    ' "$timestamp"; then....

파일 타임스탬프를 확인하는 것이 목적이라면 FreeBSD는 다음을 find지원한다는 점에 유의하세요.

find file -prune -newermt 'last sunday'

이 경우 이번 주의 시작(일요일부터 시작하는 주)을 원하는 경우 다음을 수행할 수 있습니다.

week_start=$(($(date '+%s - 86400*%w - 3600*%H - 60*%M - %S')))

이는 GNU 및 FreeBSD(또는 지원되는 시스템)에서 작동합니다 %s.

일광 절약 시간을 사용하는 시간대에서는 일광 절약 시간 전환 전후에 1시간의 지연이 있습니다.

답변2

아마도 호환성을 보장하는 가장 좋은 방법은 FreeBSD 시스템에 GNU 날짜를 설치하는 것입니다.

coreutilsFreeBSD 포트 컬렉션에서 이 패키지를 설치할 수 있습니다 . 그러면 GNU date 명령이 /usr/local/bin/gdate.

답변3

자연어로 쉽게 표현할 수 있는 모든 작업에 대해 작동하지 않을 수 있지만 FreeBSD에는 개별 날짜 필드에 대해 임의 및 상대 값을 설정할 수 있는 연산자가 date있으며 -v이 작업은 필요에 따라 반복하여 대부분의 효과를 생성할 수 있습니다.

예를 들어 마지막 일요일을 얻으려면 다음과 같이 전체 시간 필드 0을 적용한 다음 평일 0을 적용합니다.

date -v0S -v0M -v0H -v0w

따라서 Bash에서 "Linux에서 실행하든 BSD에서 실행하든 지난 일요일 이후의 초 수를 알려주세요"는 다음과 같습니다.

last_sunday_start() {
    if [ "$(uname)" = "Linux" ]; then
        date +"%s" -d "next sunday -1 week"
    else
        date -v0S -v0M -v0H -v0w +"%s"
    fi
}

date"일요일에 00:00:00이 발생한 마지막 시간"을 얻으려는 경우 질문의 GNU 예제는 올바르지 않습니다. 일요일에 호출하면 이전 일요일의 시작 시간이 반환됩니다. 위의 코드는 GNU 날짜/시간 사양도 수정합니다.

관련 정보