하나의 Liner sed 날짜 문자열을 unixtime으로

하나의 Liner sed 날짜 문자열을 unixtime으로

다음 명령을 실행하고 있습니다.

cat /tmp/myfile.log | sed -n -e 's/^.*Expire: //p'

다음 문자열을 반환합니다.

04-nov-2018

그런 다음 다음을 통해 문자열을 실행하고 싶습니다.

date -d '04-nov-2018' + "%s"

이는 유닉스타임을 반환합니다:

1541304000

단일 명령줄에서 어떻게 실행할 수 있나요?

답변1

$( )다음과 같이 명령을 실행할 수 있습니다 .

date -d "$(command)" + "%s"

귀하의 경우:

date -d "$(sed -n -e 's/^.*Expire: //p' /tmp/myfile.log)" + "%s"

또한 파일에서 직접 읽을 수 있기 때문에 sed '...' file아니라고 말했습니다 .cat file | sed '...'sed

답변2

GNU 구현이 있는 것 같으므로 date다음을 수행할 수 있습니다.

</tmp/myfile.log sed -n 's/^.*Expire: //p' | date -f - +%s

GNU sed(그리고 여전히 GNU date)를 사용하면 다음을 수행할 수도 있습니다:

</tmp/myfile.log sed -n 's/^.*Expire: /date +%s -d/ep'

(POIXLY_CORRECT가 환경에 없다고 가정)

Expire:그러나 태그 뒤에 오는 내용이 해당 형식의 날짜가 아니라는 것을 보장할 수 없는 경우 이는 명령 주입 취약점에 해당합니다. 비록 더 짧지만, date일치하는 각 줄에 대해 쉘과 명령을 실행하고 파이프를 통해 출력을 검색하여 나중에 표준 출력으로 다시 인쇄하기 때문에 위의 것보다 훨씬 덜 효율적입니다 .

GNU가 아닌 시스템에서는 다음을 사용할 수 있습니다 perl.

</tmp/myfile.log perl -MTime::Piece -lne '
  print Time::Piece->strptime($1, "%d-%b-%Y")->epoch if /Expire: (\S+)/'

zshstrftime -r또는 ( 내장) 또는 ksh93( ) 와 같은 고급 기능을 사용하는 경우 printf %T셸의 날짜 구문 분석 기능을 사용하세요.

답변3

교체 사용:

date -d "`cat /tmp/myfile.log | sed -n -e 's/^.*Expire: //p'`" + "%s"

첫 번째 명령을 래핑하면 `해당 출력을 다른 명령의 일부로 사용할 수 있습니다. 첫 번째 명령의 출력에 공백이나 특수 문자가 포함된 경우 이를 둘러싸면 "문제가 발생하는 것을 방지하는 데 도움이 됩니다.

관련 정보