web-dev-qa-db-ja.com

ワンライナーsed日付文字列をunixtimeに

次のコマンドを実行しています。

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

次の文字列を返します

04-nov-2018

次に、次のコマンドを使用してその文字列を実行します。

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

それはunixtimeを返します:

1541304000

単一のコマンドラインでそれを実行するにはどうすればよいですか?

3
whoisearth

$( )内でコマンドを実行できるため、次のように直接言うことができます。

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

あなたの場合:

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

私が言っていることにも注意してくださいsed '...' file の代わりに cat file | sed '...'sedはファイルから直接読み取ることができるため。

4
fedorqui

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+)/'

または、zshstrftime -r組み込み)やksh93printf %T)などの高度な機能を使用している場合は、シェルの日付解析機能を使用します。

3

置換を使用する:

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

最初のコマンドを`で囲むと、その出力を別のコマンドの一部として使用できます。これを"で囲むと、最初のコマンドの出力にスペースや特殊文字が含まれている場合の複雑化を防ぐのに役立ちます。

1
Micheal Johnson