다음 명령을 실행하고 있습니다.
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+)/'
zsh
strftime -r
또는 ( 내장) 또는 ksh93
( ) 와 같은 고급 기능을 사용하는 경우 printf %T
셸의 날짜 구문 분석 기능을 사용하세요.
답변3
교체 사용:
date -d "`cat /tmp/myfile.log | sed -n -e 's/^.*Expire: //p'`" + "%s"
첫 번째 명령을 래핑하면 `
해당 출력을 다른 명령의 일부로 사용할 수 있습니다. 첫 번째 명령의 출력에 공백이나 특수 문자가 포함된 경우 이를 둘러싸면 "
문제가 발생하는 것을 방지하는 데 도움이 됩니다.