STDINで読み取った行の前にエポックタイムスタンプを追加するには? [コピー]

STDINで読み取った行の前にエポックタイムスタンプを追加するには? [コピー]

プレフィックスをしたいエポック時間パラメータ行に。私が望む出力は次のとおりです。

$ echo foo bar baz | some_bash_awk_sed_date_program_or_something_else
1491146539 foo bar baz

私が得る実際の出力は次のとおりです。

$ echo foo bar baz | awk -f time_stamper.awk
1491146539
0 foo bar baz

私のものtime_stamper.awk

BEGIN { 
OFS=" "
printf "%s ", system("date +'%s'")
}
{ print }

リードは0戻り値から出ていると思います。date +'%s'。私はOFS=" "少なくとも1491146539 0 foo bar baz変更された改行を空白として返すように設定を期待しました。

現在の試みに関するいくつかの質問:

  • 私は大丈夫です。OFS 組み込み変数
  • 0なぜ前面に印刷されているのですかfoo bar baz

awkさらに重要なことは、これが作業に適したツールであるかどうかわからないということです。たぶん他のユーティリティを使用する必要がありますseddate

  • 希望の出力をどのように印刷できますか?

注:この質問はより具体的なものであるため、以下に関連しています。この問題。さらに、回答インストールが必要ですその他のユーティリティこれはUnixツールセットに興味深い追加のようです。しかし、私はタスクを実行するためにより伝統的なUnixユーティリティを使用したいと思います。

ベストアンサー1

このsystem()関数はawkコマンドを実行し、その状態を返します。0コマンドが成功したので得たのです。の出力はdate +'%s'別途印刷されます。

外部コマンドの出力を取得するには、次を使用できます。getline():

$ echo foo bar baz | awk '{"date +%s" | getline d; printf "%s %s\n", d, $0}'
1491147643 foo bar baz

OFSデフォルトでは空白なので関係ありません。


gawkまたはを使用して、mawk次のこともできます。

echo foo bar baz | gawk '{printf "%s %s\n", systime(), $0}'

systime()うるう秒を除いて、エポック以降の秒数を返します。


あっ、一人でもできますdate

date +'%s foo bar baz'

おすすめ記事