プレフィックスをしたいエポック時間パラメータ行に。私が望む出力は次のとおりです。
$ 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
さらに重要なことは、これが作業に適したツールであるかどうかわからないということです。たぶん他のユーティリティを使用する必要がありますsed
。date
- 希望の出力をどのように印刷できますか?
注:この質問はより具体的なものであるため、以下に関連しています。この問題。さらに、回答インストールが必要ですその他のユーティリティこれは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
$l
echo
echo 'foo bar baz' | while IFS= read -r l; do echo "$(date +'%s')" "$l"; done
真珠
-n
Perl
オプションは、ファイルを 1 行ずつ読み取るよう指示し、特に要求しない限り印刷しません。読み取った各行は、$_
同じように保存されます。私たちに時間を与える関数です。その後、エポック時間と現在の行を配列参照に入れて、その配列の内容を返します。式の周囲に二重引用符を使用すると、リスト要素はスペースで区切られます。次に印刷します。$0
awk
time()
Perl
builtin
epoch
anonymous
[ ..., ... ]
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