次のコマンドを実行しています。
cat /tmp/myfile.log | sed -n -e 's/^.*Expire: //p'
次の文字列を返します
04-nov-2018
次に、次のコマンドを使用してその文字列を実行します。
date -d '04-nov-2018' + "%s"
それはunixtimeを返します:
1541304000
単一のコマンドラインでそれを実行するにはどうすればよいですか?
$( )
内でコマンドを実行できるため、次のように直接言うことができます。
date -d "$(command)" + "%s"
あなたの場合:
date -d "$(sed -n -e 's/^.*Expire: //p' /tmp/myfile.log)" + "%s"
私が言っていることにも注意してくださいsed '...' file
の代わりに cat file | sed '...'
、sed
はファイルから直接読み取ることができるため。
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'
(POSIXLY_CORRECTが環境内にないと仮定)
ただし、Expire:
タグの後に続くものがその形式の日付ではないことを保証できない場合は、コマンドインジェクションの脆弱性になることに注意してください。短いですが、一致する行ごとに1つのシェルと1つのdate
コマンドを実行するため、上記よりも効率が大幅に低下します(パイプを介して出力を取得し、後でstdoutに再度出力します)。
非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
)などの高度な機能を使用している場合は、シェルの日付解析機能を使用します。
置換を使用する:
date -d "`cat /tmp/myfile.log | sed -n -e 's/^.*Expire: //p'`" + "%s"
最初のコマンドを`
で囲むと、その出力を別のコマンドの一部として使用できます。これを"
で囲むと、最初のコマンドの出力にスペースや特殊文字が含まれている場合の複雑化を防ぐのに役立ちます。