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'

答え2

吹く
ここでは、whileループを使用してstdinからパラメータを取得し、使用時に分割を実行しませんIFS=readこれにより、スペースと一緒に行全体が保存されます。最後に、変数を介してパラメータを取得echoできます。覚えておくべき1つは、コードの予測可能な動作のためにすべてのパラメータを引用符で囲む必要があることです。timestamp$lecho

echo 'foo     bar baz' | while IFS= read -r l; do echo "$(date +'%s')" "$l"; done

真珠

-nPerlオプションは、ファイルを 1 行ずつ読み取るよう指示し、特に要求しない限り印刷しません。読み取った各行は、$_同じように保存されます。私たちに時間を与える関数です。その後、エポック時間と現在の行を配列参照に入れて、その配列の内容を返します。式の周囲に二重引用符を使用すると、リスト要素はスペースで区切られます。次に印刷します。$0awktime()Perl builtinepochanonymous[ ..., ... ]dereferencing@{ ... }"..."@{...}

echo ... |  perl -ne 'print "@{[+time,$_]}"'

IFS= read -r l <<<"$(echo 'foo    bar baz')"
printf '%d %s\n' "$(date +'%s')" "$l"

答え3

sedを使用してこれを実行することもできます。

パスワード:

 echo 1 2 3 | sed 's/^/'`date +"%s"`' /'

結果:

1491148928 1 2 3

関連情報